Неблокирующая функция ожидания в Objective-C

Я новичок в Objective-C, и я не могу понять, как ждать неблокирующим образом. У меня есть объект, который заполняется асинхронно, и мне нужно подождать, прежде чем я смогу перейти к другому методу. Прямо сейчас я использую функцию сна, но это блокирует все приложение, и myObject никогда не загружается.

while (!myObject)
{
    sleep(1);
}
return myObject;

EDIT: этот фрагмент кода относится к методу, который может быть вызван до загрузки myObject. В этом случае я действительно хочу блокировать этот метод, но мой код блокирует все, включая myObject, из загружаемого.

Ответ 1

Если вы можете, предложите метод класса myObjectLoaded:, который будет вызываться, когда объект, о котором идет речь, будет загружен. В противном случае самым идиоматическим эквивалентом того, что вы написали выше, является создание таймера, который продолжает проверять myObject и что-то делает, когда он его находит.

Если вам действительно нужно было сделать это в середине метода по какой-то причине, вам нужно создать цикл, который будет работать с runloop. Это отсутствие runloop, из-за чего приложение блокируется.

Ответ 2

Этот маленький персик работал у меня (чтобы задержаться на 20 секунд)....

CFRunLoopRunInMode(kCFRunLoopDefaultMode, 20.0, false);

Ответ 3

NSNotification должна решить проблему.

http://developer.apple.com/documentation/Cocoa/Conceptual/Notifications/Introduction/introNotifications.html

Вместо того, чтобы ждать на объекте, зарегистрируйте этот регистр объекта для уведомлений, исходящих из вашего другого объекта (скажем, издателя), который асинхронно заполняет данные. Один из этих объектов Publisher завершается, если он опубликовал NSNotification, который затем автоматически будет загружен вашим ожидающим объектом. Это также устранит ожидание.

Ответ 4

Похоже, вы ищете шаблон наблюдателя. Apple называет это " notification".

Ответ 6

Это потому, что вы останавливаете основной поток, ожидающий загрузки вашего объекта. Не делайте этого, потому что основной поток - это поток, который управляет пользовательским интерфейсом и ждет ввода пользователя. Если вы блокируете основной поток, вы блокируете пользовательский интерфейс приложения.

Если вы хотите, чтобы основной поток что-то делал при загрузке объекта, затем создайте метод myObjectLoaded: и вызовите из ваших загрузочных потоков:

[myObjectController performSelectorOnMainThread:@selector(myObjectLoaded:) 
                                     withObject:myObject 
                                  waitUntilDone:NO];

где myObjectController может быть любым объектом даже самого myObject.