从多个线程收集返回值

时间:2012-02-14 10:36:41

标签: ios multithreading

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

- (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];
}

请评论,即使我是一个完整的混蛋,也不要只是'减去一个'我:-)减去一个并没有告诉我多少。 (除此之外,我很远)

1 个答案:

答案 0 :(得分:1)

使用线程而不是NSURLConnection执行此操作没有性能优势。您可以在没有线程的情但是,通常,连接到服务器的延迟是移动设备上最大的性能障碍。如果你可以保持一个连接,事情就会变得更快。如果您允许,NSURLConnection将使用HTTP / 1.1连接自动执行此操作(即,如果您不通过自己的线程对抗它)。然而,打开许多同时连接不太可能对你有所帮助,除非服务器对每个服务器的响应速度极慢但仍然能够并行处理多个(这是非常罕见的情况)。

您还可以查看MKNetworkKit,其中包含一些帮助您管理同步请求的工具。