2012-03-06 92 views
3

我正在移植一个我为iOS制作的Android应用。 Android有一个Yield()函数来将线程从运行线程移动到线程队列的后端(?)。这非常有用,所以这个线程不会占用太多的CPU,并且让其他所有的东西呆滞。它适用于我的Android应用程序。NSInvocationOperation等效收益

我正在使用NSInvocationOperation对象来实现我的线程。如何添加类似于Android(POSIX's)Yield()的功能?

回答

6

我正在使用NSInvocationOperation对象来实现我的线程。

这并没有什么意义。 NSOperations运行在一个线程中,但它们本身不是线程,也不会让你实现任何与线程等价的东西。如果您确实需要线程,请使用NSThreadpthread

如何添加类似于Android(POSIX's)Yield()的功能?

如果您真的想要POSIX,请尝试sched_yield()。在更高的层次上,有pthread_yield_np()(np表示不可移植 - POSIX中没有pthread_yield()) - 但除了调用sched_yield()之外什么都不做。

我不会打扰,直到你发现你真的需要这个,并且它有帮助。在iOS或Mac应用中做这类事情并不常见。

+0

更改'NSInvocationOperation'到'NSThread'(采用非常类似的语法),并呼吁'pthread_yield_np()'线程内。我不得不阅读一下'NSThread'只是POSIX线程上的一个层,所以我具有所有这些低层次的好处。 – Warpspace 2012-03-07 05:18:10

1

你看过Grand Central Dispatch吗?这是在iOS上编写多线程代码的最佳方法之一。 (当然,这不是一个完美的解决所有线程问题的方法,所以它取决于你的应用程序。)作为一个例子,GCD为你提供了一些优先级较低的队列,用于不关键性的操作。

编写现代iOS应用程序的通常方法是只在主线程上保留UI代码(≈在主GCD队列中),并将其他操作卸载到全局GCD队列之一。来自这些队列的块不占用主线程,它们被卸载到某个后台线程(由系统管理,而不是你)。从程序员的角度来看,它非常简单,它似乎工作得很好。

0

我建议你使用NSOperationQueue和subclassed NSOperations。这将有所帮助。

0

您可以使用GCD此:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    // Do the heavy work 
    // ... 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     // Reflect the result in the UI 
     // ... 

    }); 
});