2015-03-17 2 views
0

Я изучил документацию Apple о асинхронной работе, и я не могу получить ее должным образом.Как создать асинхронный NSOperation iOS?

Я делюсь своим пониманием и усилиями. Пожалуйста, взгляните и предложите мне правильно понять асинхронный NSOperation.

Asynchronous - это свойство readonly, и мы не можем его изменить. Я создал класс, который наследует NSOperation. У меня также есть начальный и основной метод.

Я не использую NSOperationQueue. Когда я запускаю операцию, используя [начало работы]; метод на основной теме. Затем в начале и в главном методе я получаю isAsynchronous '0'.

При запуске операции на вторичном потоке с помощью

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    operation = [[CustomOperation alloc] init]; 
    [operation start]; 
} 

Я до сих пор получаю isAsynchronous «0» в начале и в основной реализации метода.

Я не понимаю, почему isAsynchronous всегда возвращает «0» в любом потоке. Пожалуйста, дайте мне знать причину этого.

Я видел, что на основании этой проблемы были заданы некоторые вопросы, но я не мог понять эту функциональность.

Было бы полезно для меня, если вы дадите мне какой-либо пример, чтобы я мог правильно его понять.

Пожалуйста, дайте мне знать, если я не достаточно ясен, и я должен описать это больше.

ответ

2

Вы смешиваете Grand Central Dispatch и NSOperation.

По умолчанию NSOperation является синхронным - при его запуске он запускается на текущий поток до тех пор, пока он не завершится. Вы запускаете синхронный NSOperation на фоновом потоке, поэтому он будет работать на этом фоновом потоке до тех пор, пока он не завершится. Это не проблема. Он работает в фоновом режиме. Он не называет себя «асинхронным», потому что он не заботится о потоках.

В большинстве случаев вам гораздо выгоднее пользоваться Grand Central Dispatch и не использовать NSOperation вообще. Точка, в которой вы используете NSOperation, - это когда вам нужно ее отменить.

+0

Спасибо за ваш ответ. Теперь ситуация для меня понятна. Погодите, чтобы поток был создан или создан пользователем, работа начинается синхронно. Но можете ли вы привести мне пример для «Как я могу начать асинхронное NSOperation?» или "в каком состоянии я получу NSOperation isAsynchronous '1'? –

+0

gnasher729: Я все еще боюсь с NSAperation isAsynchronous '1'. У меня нет подсказки, или я не мог понять, в каком состоянии я получаю NSOperation isAsynchronous как «1». Буду признателен за вашу помощь, если вы можете дать мне образец для этого или вы можете предоставить мне ссылку, чтобы я мог понять функциональность. –

+0

Вы можете попробовать создать NSBlockOperation и поместить асинхронный код внутри блока. – Revinder

0
NSBlockOperation *operation_6 = [NSBlockOperation blockOperationWithBlock:^{ 
    NSLog(@"66666666666"); 
    NSLog(@"66==%@",[NSThread currentThread]); 
}]; 


dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     [operation_6 start]; 
}); 

log:[7052:1932587] 66==<NSThread: 0x7fd18e73ef60>{number = 2, name = (null)} 
Смежные вопросы