应用程序生命周期任务的GCD dispatch_async?

时间:2013-02-15 22:12:06

标签: objective-c grand-central-dispatch

我之前使用GCD和dispatch_async用于后台线程工作单元,比如从网络请求(例如,JSON或XML)中解析数据,这是非常好的。但是,如果我的后台任务将在应用程序的长度内运行,该怎么办? dispatch_async仍然适合这种情况,还是有更好的方法来实现它?

2 个答案:

答案 0 :(得分: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];

如果您需要与其他线程/队列进行通信,可能需要使用标准同步技术。

答案 1 :(得分:1)

这与dispatch_async无关,这只是在后台线程中做某事的一种方法。如果你想在后台线程中做一些事情,请在后台线程中执行!请注意,不断地执行此操作可能会拖累您的应用,因为您只需要很多处理时间而且只需要很多处理器;你可能最终不得不在仪器中学习。您可能希望将您的任务分解为一点点,并且每隔一段时间就以短块进行。 GCD和NSOperation都可以提供帮助。