iOS线程 - 回调最佳实践

时间:2012-03-15 08:15:56

标签: objective-c ios multithreading networking

我想清理我的一个项目,并在单个课程中提取我经常重复使用的部分源代码。 这个类处理一些对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服务的返回值?

提前致谢。

约翰

2 个答案:

答案 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更新,即使它们发生在工作线程的中间,例如更新已下载的信息量。使用相同的技术使用相关信息调用主线程。