2010-11-13 5 views
0

Я написал несколько примеров кода в отдельном приложении, которое в основном ставит в очередь элементы в NSMutableArray. Затем у меня есть метод, который проходит через этот массив и создает NSInvocationOperation, помещает его в NSOperationQueue, освобождает операцию и т. Д. Затем метод вызывается (просто печатает строку, которая была сохранена в массиве и передана в операцию), выполняет ли это задание и отправляет NSNotification обратно в ViewController. Метод наблюдателя получает удар, но операции имеют отставание от них. Например, метод наблюдателя просто обновляет UILabel, сколько сообщений осталось в очереди. В конечном итоге это происходит, но, похоже, существует пять секунд отставания от всех завершений NSOperations и обновления пользовательского интерфейса. Мне кажется, что NSOperationQueue блокирует основной поток. В любом случае, чтобы пользовательский интерфейс немедленно ответил на уведомления?NSOperationQueue lag on IOS4

Важно отметить, что я еще не тестировал это на телефоне, просто симулятор. Я не уверен, что это имеет значение.

Извините заранее. Я далеко от компьютера, и у меня нет кода передо мной. Надеюсь, я объяснил это достаточно хорошо. Также я прочитал документацию, просто не нашел ничего, что действительно отвечает на этот конкретный вопрос для меня.

+0

Это может быть не очень важно, но в какой поток вы публикуете уведомления? По умолчанию уведомления, отправленные с центром уведомлений по умолчанию, принимаются в потоке, на котором они отправляются. – warrenm

+0

Ну, это может иметь смысл, потому что ViewController получает уведомления, поэтому я предполагаю, что NSOperationQueue работает в одном потоке, поскольку он отправляет уведомления. – iosnewbie

+0

Так, например, - (void) messagePosted: (NSNotification *) note {lblMessage.text = "Привет";} получает удар, но текст lblMessage на самом деле не меняется на «Привет» в течение нескольких секунд после операций в очереди были завершены. – iosnewbie

ответ

1

Задержка типична для обновлений пользовательского интерфейса, которые выполняются на потоках, отличных от основного.

Чтобы увидеть обновление сразу на UILabel, обязательно ссылаться на то, что метод обновления лейбла text следующим образом:

[self performSelectorOnMainThread:@(myMethodToUpdateLabelWithText:) withObject:text waitUntilDone:NO]; 

где myMethodToUpdateLabelWithText является метод в классе, который устанавливает значение текста лейбла.