0

我之前使用过 GCDdispatch_async来处理后台线程工作单元,例如解析来自网络请求(例如 JSON 或 XML)的数据,它非常棒。但是,如果我有一个要在应用程序的整个期间运行的后台任务怎么办?dispatch_async仍然适合这种情况,还是有更好的方法来实现它?

4

2 回答 2

3

当然可以,但要为它创建自己的调度队列。(如果您使用全局队列,您可能会永远占用该队列 - 或其线程之一。)

dispatch_queue_t dispatchQueue = dispatch_queue_create("com.mycompany.myapp.ForeverOperation", DISPATCH_QUEUE_SERIAL);
dispatch_async(dispatchQueue, ^{
    // worker routine 
});

更传统地,您会为此创建一个显式线程,如果它将永远运行,那可能会更“有意义”。但结果基本相同。

NSThread * myWorkerThread = [[NSThread alloc] initWithTarget:...
[myWorkerThread start];

如果您需要与其他线程/队列通信,一如既往,可能需要标准同步技术。

于 2013-02-15T22:16:59.813 回答
1

这实际上与 无关dispatch_async,这只是在后台线程中做某事的一种方法。如果您想在后台线程中执行某些操作,请在后台线程中执行!请注意,经常这样做可能会拖累您的应用程序,因为您只有这么多的处理时间和这么多的处理器;你可能最终不得不在 Instruments 中学习。你可能想把你的任务分解成小块,每隔一段时间就做一小块。GCD 和 NSOperation 都可以提供帮助。

于 2013-02-15T22:17:24.793 回答