我想清理我的一个项目,并在单个课程中提取我经常重复使用的部分源代码。 这个类处理一些对Web服务的请求,到目前为止一切都很好;)。在我将代码提取到自己的类之前,我使用调用类中的线程和回调来处理这些请求。
现在我有一个"最佳实践"问题:
在我的代码中,我做了类似(简化)的事情:
(void)foo{
Helper *h =[[Helper alloc]init];
[h doRequest];
}
doRequest执行网络操作(在自己的类中),我必须等到请求完成。所以我需要一个回调或类似的东西。
我应该简单地线程doRequest包括。 waituntildone = YES?
我是否也必须在Helper类中连接网络?或者是否足以将方法调用为以下内容:
[NSThread detachNewThreadSelector:@selector(h doRequest) toTarget:self withObject:nil];
在完成任务之后从doRequest回调到调用者类的最佳做法是什么,以便我可以处理来自Web服务的返回值?
提前致谢。
约翰
答案 0 :(得分:3)
鉴于doRequest在请求完成后才会返回
- (void)fooCompletion:(void (^)(void))completion {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
Helper *h =[[Helper alloc]init];
[h doRequest];
if (completion) {
dispatch_async(dispatch_get_main_queue(), ^{
// doRequest is done
completion();
});
}
});
}
调用方法:
[self fooCompletion:^{
// do something after doRequest is done
}];
答案 1 :(得分:2)
我个人更喜欢调用performSelectorOnMainThread:withObject:waitUntilDone:在需要发送信息的任何帮助程序线程的末尾。
[self performSelectorOnMainThread:@selector(infoFromService:) withObject:aDictionaryWithInfo waitUntilDone:NO];
- (void)infoFromService:(NSDictionary *)aDictionary {
//Process all the information and update UI
}
确保始终使用主线程进行任何UI更新,即使它们发生在工作线程的中间,例如更新已下载的信息量。使用相同的技术使用相关信息调用主线程。