2014-09-23 2 views
0

Если я звоню invoke по адресу NSInvocation, это то же самое, что и вызов performSelector: с аргументом waitUntilDone:YES? То есть, invoke блокирует выполнение до тех пор, пока вызываемый селектор не будет выполнен?Выполняет [NSInvocation invoke] выполнение блока до завершения?

Другими словами, являются ли следующие две строки кода одинаковыми?

// myInvocation is of type NSInvocation 
[myInvocation invoke]; 
[myInvocation performSelectorOnMainThread:@selector(invoke) withObject:nil waitUntilDone:YES]; 

ответ

3

[NSInvocation invoke] точно так же, как вызов сообщения, которое представляет NSInvocation. Как любой вызов сообщения, он будет делать это в текущем потоке.

+0

Но будет ли он блокировать выполнение? Я спрашиваю из-за проблемы с 'NSMutableData.writeToFile:', которая не блокирует. См. http://stackoverflow.com/questions/11161079/nsdata-writetofileatomically-doesnt-immediately-save-the-file – nyi

+2

Я сказал, что это точно так же, как обычный вызов метода. Обычные вызовы методов блокируются. Вызов [someObject doStuff] или создание вызова и вызов [invocation invoke] _exactly_ совпадают. – gnasher729

+0

У вас возникли проблемы с writeToFile: самостоятельно? В документации ничего не сказано о неблокировании, поэтому я предполагаю, что он блокирует. Тем более, что для неблокирующего вызова должна быть какая-то информация, как узнать, когда она будет завершена, и нет. Просто потому, что у кого-то есть проблемы с этим, это не значит, что они правы. Будучи неблокируемым, этот способ неприменим. – gnasher729