我需要做多个网络请求,并希望它快速。数据量非常小,但服务器使用一些时间来回答,所以我正在考虑使用多个线程。问题是如何处理返回值。我不知道这是否有效:
- (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];
}
请评论,即使我是一个完整的混蛋,也不要只是'减去一个'我:-)减去一个并没有告诉我多少。 (除此之外,我很远)
答案 0 :(得分:1)
使用线程而不是NSURLConnection
执行此操作没有性能优势。您可以在没有线程的情但是,通常,连接到服务器的延迟是移动设备上最大的性能障碍。如果你可以保持一个连接,事情就会变得更快。如果您允许,NSURLConnection
将使用HTTP / 1.1连接自动执行此操作(即,如果您不通过自己的线程对抗它)。然而,打开许多同时连接不太可能对你有所帮助,除非服务器对每个服务器的响应速度极慢但仍然能够并行处理多个(这是非常罕见的情况)。
您还可以查看MKNetworkKit,其中包含一些帮助您管理同步请求的工具。