NSInvocationOperation产量等价

时间:2012-03-06 09:07:42

标签: objective-c multithreading

我正在移植我在iOS上制作的Android应用。 Android有一个Yield()函数可以将线程从运行转移到线程队列的后面(?)。这很有用,因此这个线程不会占用太多的CPU并使其他一切都变得迟钝。它在我的Android应用程序中运行良好。

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

4 个答案:

答案 0 :(得分:6)

  

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

这没有多大意义。 NSOperations在一个线程中运行,但它们本身不是线程,也不会让你实现与线程等效的任何东西。如果您真的想要一个帖子,请使用NSThreadpthread

  

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

如果您真的想要POSIX,请尝试sched_yield()。在更高级别,有pthread_yield_np()(np表示非便携式 - POSIX中没有pthread_yield() - 但除了呼叫sched_yield()之外什么都不做。

在你发现自己确实需要这个之前我不会打扰,这会有所帮助。在iOS或Mac应用程序中执行此类操作并不常见。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

我建议您将NSOperationQueue与子类NSOperations一起使用。那会有所帮助。

答案 3 :(得分: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
        // ...

    });
});