Создание делегатов для NSOperation: проблема обратного вызова - PullRequest
0 голосов
/ 16 мая 2011

Я столкнулся с проблемой в простом TableView: я хочу обновить данные из сети в отдельном потоке, чтобы избежать блокировки пользовательского интерфейса.Я создал NSoperation, который сделает работу.Этот объект создает другой объект для обработки загрузки.Делегатом загрузчика является объект NSoperation.

Моя проблема в том, что мой объект NSoperation не получает никакого вызова от загрузчика.

Если я не являюсь отдельным потокомтот же код (и вызывающий метод main), он отлично работает.

Ответы [ 2 ]

1 голос
/ 16 мая 2011

Как сказал Мираж, NSURLConnection предназначен для использования runloop.Вы получаете работающую настройку runloop для вас в главном потоке, но в других потоках, которые вы создаете, runloop должен управляться вручную (в основном вы должны его запускать).

Мой совет - использовать параллельную NSOperation и в методе start проверить, если вы находитесь в главном потоке: если нет, снова вызвать метод start в основном потоке и выручить

-(void)start 
{
     if ([NSThread mainThread] != [NSThread currentThread]) {
           [self performSelectorOnMainThread:@selector(start)];
           return;
     }
     rest of the real code is here ....
}

Другими вариантами (более чистыми, но определенно сложными) является создание операции NSO, которая управляет внутренним циклом выполнения (или предоставленным вызывающей стороной), чтобы асинхронные API-интерфейсы, которым это необходимо (например, NSURLConnection), могли запускаться в потоках, отличных от основного.,

Поиск образца «LinkedImageFetcher» в официальном API: класс QRunLoopOperation делает именно это.

0 голосов
/ 16 мая 2011

Пример кода было бы неплохо. Есть ли шанс, что вы используете NSURLRequest в этом отдельном потоке? Если это так, попробуйте запустить NSURLRequest в основном потоке (NSURLRequest может быть асинхронным сам по себе в любом случае, так что это прекрасно).

РЕДАКТИРОВАТЬ Я имел в виду NSURLConnection, а не запрос.

...