NSInvocationOperation Эквивалент доходности - PullRequest
3 голосов
/ 06 марта 2012

Я портирую Android-приложение, которое я сделал, на iOS. В Android есть функция Yield(), позволяющая переместить поток из хода в конец (?) Очереди потока. Это полезно, чтобы этот поток не перегружал процессор и не делал все остальное вялым. Это хорошо работает в моем приложении для Android.

Я использую NSInvocationOperation объекты для реализации своих потоков. Как добавить функциональность, аналогичную Android (POSIX) Yield()?

Ответы [ 4 ]

6 голосов
/ 06 марта 2012

Я использую объекты NSInvocationOperation для реализации своих потоков.

Это не имеет большого смысла.Операции NSO выполняются в потоке, но сами они не являются потоками и не позволят вам реализовать что-либо эквивалентное потоку.Если вы действительно хотите поток, используйте NSThread или pthread.

Как добавить функциональность, аналогичную Android (POSIX) Yield ()?

ЕслиВы действительно хотите POSIX, попробуйте sched_yield().На более высоком уровне есть pthread_yield_np() (np означает непереносимый - в POSIX нет pthread_yield()) - но это ничего не делает, кроме как вызвать sched_yield().

Я бы не стал беспокоиться, покаВы обнаружите, что вам это действительно нужно, и это помогает.Подобные вещи не распространены в приложениях для iOS или Mac.

1 голос
/ 06 марта 2012

Вы смотрели в Grand Central Dispatch?Это один из лучших способов написания многопоточного кода на iOS.(Конечно, это не идеальное решение всех проблем с потоками, поэтому оно зависит от вашего приложения.) Например, GCD предлагает вам очереди с более низким приоритетом для операций, которые не являются критичными для производительности.

Обычныйспособ написать современное приложение для iOS - сохранить только код пользовательского интерфейса в главном потоке (в основной очереди GCD) и перенести другие операции в одну из глобальных очередей GCD.Блоки из этих очередей не загружают основной поток, они выгружаются в какой-то фоновый поток (управляемый системой, а не вами).Это очень просто с точки зрения программиста и, кажется, работает очень хорошо.

0 голосов
/ 06 марта 2012

Вы можете использовать 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
        // ...

    });
});
0 голосов
/ 06 марта 2012

Я бы предложил вам использовать NSOperationQueue с подклассами NSOperations.Это помогло бы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...