Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从多个线程收集返回值_Ios_Multithreading - Fatal编程技术网

Ios 从多个线程收集返回值

Ios 从多个线程收集返回值,ios,multithreading,Ios,Multithreading,我需要做多个网络请求,并希望它是快速的。数据量非常小,但服务器需要一些时间来回答,因此我考虑使用多线程。问题是如何处理返回值。我不知道这是否有效: - (void)findAuthorsForBookIDs:(NSArray*)bookIDs { for (NSString* thisBookID in bookIDs) { [NSThread detachNewThreadSelector:@selector(findAuthorForBook:) toTarg

我需要做多个网络请求,并希望它是快速的。数据量非常小,但服务器需要一些时间来回答,因此我考虑使用多线程。问题是如何处理返回值。我不知道这是否有效:

- (void)findAuthorsForBookIDs:(NSArray*)bookIDs
{
    for (NSString* thisBookID in bookIDs)
    {
        [NSThread detachNewThreadSelector:@selector(findAuthorForBook:) toTarget:self withObject:thisBookID];
    }
}

-(void)findAuthorForBook:(NSString*)thisBookID
{
    NSString *downloadString = [NSString stringWithFormat:
                                    @"http://somewebsite.com/Mediator?bookIDNo=%@", 
                                    thisBookID];

    NSURL *downloadUrl = [NSURL URLWithString:downloadString];

    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:downloadUrl];

    NSError *error;
    NSURLResponse *response;

    NSData *urlData = [NSURLConnection sendSynchronousRequest:urlRequest 
                                     returningResponse:&response
                                                 error:&error];

    NSString *html2;

    if (urlData) 
    {
        html2 = [[NSString alloc] initWithData: urlData encoding: NSISOLatin1StringEncoding];
    }

    [self findAuthorForBookDidFinishWithAuthor:html2 andBookID:thisBookID];


} 

-(void)findAuthorForBookDidFinishWithAuthor:(NSString *)authorName andBookID:(NSString *)bookID
{
    [[self bookList]setValue:authorName forKey:bookID];
}
我不知道[self bookList]是否会处理这个问题?我应该用锁还是别的什么

编辑

我读了一些书,想知道这是否是我需要做的

NSLock*myLock=[[NSLock alloc]init]

-(void)findAuthorForBookDidFinishWithAuthor:(NSString *)authorName andBookID:(NSString *)bookID
{
    [myLock lock];
    [[self bookList]setValue:authorName forKey:bookID];
    [myLock unlock];
}

请评论,即使我是个十足的混蛋,也不要只是“减一”我:-)减一并不能告诉我太多。(除此之外,我还远远不够)

使用线程而不是
NSURLConnection
执行此操作对性能没有好处。您可以在没有线程的情况下同时打开多个请求。然而,连接到服务器的延迟通常是移动设备上最大的性能障碍。如果你能保持一个单一的连接,事情会进展得更快<如果您允许,code>NSURLConnection将使用HTTP/1.1连接自动完成其中一些操作(即,如果您不通过自己的线程来解决问题)。但是,同时打开多个连接不太可能对您有很大帮助,除非服务器对每个连接的响应速度非常慢,但仍然能够并行处理多个连接(这种情况非常罕见)

您还可以查看,其中包括几个用于帮助您管理同时请求的工具