2013-02-15 99 views
0

我已经使用GCD之前的dispatch_async用于背景线程工作单元,比如解析来自网络请求(例如JSON或XML)的数据,并且它是WONDERFUL。但是如果我有一个后台任务要运行应用程序的长度呢? dispatch_async仍然适合这种情况,还是有更好的实施方法?适用于应用程序生命周期任务的GCD dispatch_async?

回答

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

一些家庭作业表明,自定义队列将默认将其目标队列设置为全局默认优先级队列,这意味着提交给自定义队列的工作将在全局默认队列上执行。那么,无论如何我将在全局执行时创建自定义队列有什么优势? – 2013-03-26 20:08:50

1

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

相关问题