【问题标题】:Call back to delegate using the main thread rather than secondary thread?使用主线程而不是辅助线程回调委托?
【发布时间】:2010-01-19 20:00:15
【问题描述】:

我定义了一个名为“AsyncNetworkOperation”的类,它是 NSOperation 的子类,用于在我的应用程序中执行数据库查询。我的 AsyncNetworkOperation 类有一个协议,供启动 AsyncNetworkOperation 的对象使用:

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

这一切都很好,除非我要回调的委托想要显示 UIAlertView、启动 NSTimer 或执行辅助线程不应该执行的其他操作,或者需要额外的努力去做。

所以这是我的问题:当我回调委托时,我应该通过 -[NSObject performSelectorOnMainThread:] 这样做吗?这样做似乎可以让我的委托从必须知道它是通过辅助线程还是主线程回调的负担中解脱出来,从而允许它以最直接的方式实现功能,没有任何限制。

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

谢谢。

【问题讨论】:

    标签: iphone multithreading


    【解决方案1】:

    我建议让 AsyncNetworkOperation 在调用它的同一线程中调用委托对象。所以如果异步操作首先在主线程上调用,那么它应该在主线程上调用委托!

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

    【讨论】:

    • 最好的方法是什么?我最好的猜测: 1)当异步操作启动时,调用 +[NSThread currentThread] 来获取调用操作的线程。存储在实例变量中。 2) 操作完成后,使用 -[NSObject performSelector:onThread:withObject:waitUntilDone:] 调用委托,通过 onThread: 参数传递存储的线程。这看起来是否正确,或者有更清洁的方法吗?谢谢。
    • @Greg,如果您实际上是自己创建线程,这听起来很正确。否则,可能不需要。
    • 我只是在实例化一个 NSOperation 并将其添加到一个 NSOperationQueue 中。这就是您所说的“自己创建线程”的意思吗? (我问这个只是因为一些 Cocoa 文档似乎暗示使用 NSOperation 是一种绕过创建线程的方法......当我对它的真正工作方式的理解是 NSOperationQueue 为我创建一个线程时。)
    猜你喜欢
    • 2022-01-05
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多