繁体   English   中英

iOS线程-回调最佳实践

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM