[英]iOS threading - callback best practice
我想在一个类中清理我的一个项目,并提取我经常重用的部分源代码。 此类处理对Web服务的一些请求,到目前为止,一切都很好;)。 在将代码提取到自己的类之前,我使用调用类中的线程和回调来处理这些请求。
现在,我有一个“最佳实践”问题:
在我的代码中,我做了类似(简化)的事情:
(void)foo{
Helper *h =[[Helper alloc]init];
[h doRequest];
}
doRequest执行网络操作(在其自己的类中),我必须等待直到请求完成。 所以我需要一个回调或类似的东西。
我应该简单地将doRequest incl包括在内吗? waituntildone = YES?
我是否也必须将网络连接到Helper类中? 还是足以让该方法线程化如下代码:
[NSThread detachNewThreadSelector:@selector(h doRequest) toTarget:self withObject:nil];
在doRequest完成任务后从doRequest回调到调用方类的最佳方法是什么,以便我可以处理Web服务返回的值?
提前致谢。
约翰内斯
给定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
}];
我个人更喜欢在需要发送回信息的任何帮助程序线程的末尾调用performSelectorOnMainThread:withObject:waitUntilDone:。
[self performSelectorOnMainThread:@selector(infoFromService:) withObject:aDictionaryWithInfo waitUntilDone:NO];
- (void)infoFromService:(NSDictionary *)aDictionary {
//Process all the information and update UI
}
确保始终将主线程用于任何UI更新,即使它们发生在工作线程的中间,例如,更新已下载了多少信息的计数。 使用相同的技术来调用具有相关信息的主线程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.