executeSelector NSThread проблема - PullRequest
1 голос
/ 16 марта 2011

Можно ли отменить поток, пока executeSelector waitsUntilDone?

См. Ниже:

У меня есть цикл while со следующей строкой:

[self performSelector:@selector(getMyRecords:) onThread:myThread withObject:i waitUntilDone:YES]

Иногда мне нужно отменить мой поток myThread во время выполнения моего цикла. Я получаю следующую ошибку:

Terminating app due to uncaught exception 'NSDestinationInvalidException', reason: '*** -[MyController performSelector:onThread:withObject:waitUntilDone:modes:]: target thread exited while waiting for the perform'

Ответы [ 3 ]

0 голосов
/ 16 марта 2011

Я думаю, что самый простой способ - это использовать NSThread's - (void) отменить метод.

0 голосов
/ 16 марта 2011

Ознакомьтесь с документацией по NSObject:

Этот метод ставит в очередь сообщение в цикле выполнения целевого потока, используя режимы цикла выполнения по умолчанию, то есть режимы, связанные с константой NSRunLoopCommonModes.Как часть своей обычной обработки цикла выполнения, целевой поток удаляет сообщение из очереди (при условии, что он работает в одном из режимов цикла выполнения по умолчанию) и вызывает нужный метод.

Нельзя отменить сообщения, поставленные в очередь с помощьюэтот метод. Если вы хотите отменить сообщение в текущем потоке, вы должны использовать executeSelector: withObject: afterDelay: или executeSelector: withObject: afterDelay: inModes: method.

Этот методсохраняет приемник и параметр arg до тех пор, пока не будет выполнен селектор.

0 голосов
/ 16 марта 2011

если у вас есть длительная операция внутри потока, вы можете объявить переменную условия (атомарную), например, «отменено», и проверить ее.что-то вроде:

- (void) threadFunc {
 while (!canceled){
   // do stuff
 }
}


- (void) cancelThread {
 canceled = true;
}
...