2010-01-19 95 views
1

我定义了一个名为'AsyncNetworkOperation'的类,它是NSOperation的一个子类,用于在我的应用程序中执行数据库查询。我AsyncNetworkOperation类有一个协议,由该启动AsyncNetworkOperation对象使用:使用主线程而不是辅助线程回调委托?

@protocol AsyncNetworkOperationDelegate 
@optional - (void)operationAboutToFinish; 
@required - (void)operationFinishedWithData:(id)retrievedData; 
@required - (void)operationFinishedWithError:(NSError*)error; 
@end 

这一切工作正常,但在我打电话回代表要显示UIAlertView中的情况下,启动NSTimer,或者做一些辅助线程要么不应该做的事情,要么做额外的工作。

所以这里是我的问题:当我回调委托,我应该通过 - [NSObject performSelectorOnMainThread:]?看起来这样做可以让我的委托人不必知道它是通过二级线程还是主线程回叫,从而允许它以最直接的方式实现功能,而没有任何限制。

只是想知道解决这个问题的标准方法。

谢谢。

回答

0

我会建议让AsyncNetworkOperation调用委托对象在它被调用的同一个线程中。因此,如果首次在主线程上调用异步操作,那么它应该在主线程上调用委托。

您可以想象未来的使用,其中代理不需要更新UI并从辅助线程调用它会很好。

+0

这样做的最好方法是什么?我最好的猜测:1)当异步操作开始时,调用+ [NSThread currentThread]来获取调用该操作的线程。存储在一个实例变量中。 2)当操作完成后,使用 - [NSObject performSelector:onThread:withObject:waitUntilDone:]调用委托,通过onThread:参数传递存储的线程。这看起来是否正确,还是有更干净的方式?谢谢。 – 2010-01-19 21:18:44

+0

@Greg,如果你真的自己创建线程,这听起来是正确的。否则,可能不需要。 – notnoop 2010-01-19 21:20:09

+0

我只是实例化一个NSOperation并将其添加到NSOperationQueue。这是你“自己创建线程”的意思吗? (我问这只是因为一些Cocoa文档几乎似乎暗示使用NSOperation是一种绕过创建线程的方式......当我了解它的真正方式时,NSOperationQueue为我创建了一个线程。) – 2010-01-19 21:32:29