2012-03-15 58 views
0

我想清理我的一个项目,并在一个类中提取我经常重用的部分源代码。 该类处理一些对Web服务的请求,目前为止一切正常;)。在我将代码提取到它自己的类之前,我使用调用类中的线程和回调来处理这些请求。iOS线程 - 回调最佳实践

现在我有一个“最佳实践”的问题:

在我的代码我像做(简体):

(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得到一个回调给调用者类,它已经完成后,它的任务,这样我可以处理从返回的值网络服务?

在此先感谢。

约翰内斯

回答

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 
}]; 
+0

似乎工作:) 谢谢 – 2012-03-18 16:10:42

2

我个人比较喜欢叫performSelectorOnMainThread:withObject:waitUntilDone :在任何需要发送信息的助手线程结束时。

[self performSelectorOnMainThread:@selector(infoFromService:) withObject:aDictionaryWithInfo waitUntilDone:NO]; 

- (void)infoFromService:(NSDictionary *)aDictionary { 
    //Process all the information and update UI 
} 

一定要始终使用主线程任何UI更新,即使它们发生在工作线程的中间,例如更新的多少信息已被下载的次数。使用相同的技术来调用主线程的相关信息。