Вызов NSURLConnection внутри dispatch async и чтение didReceiveResponse в mainRunLoop в разработке iPhone


То, что я пытаюсь сделать, это получить ответ для следующего метода

 - (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { }

После вызова этого

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[conn scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[conn start];

В

dispatch_async();

Но метод connection не вызывает. Но когда я запускаю код NSURLConnection вне dispatch_async, он вызывает метод.

В чем причина этого и как я могу ее исправить? Это потому, что delegate ссылается на self и self ссылается на фоновый поток, но не на сам класс UIViewController?
1 3

1 ответ:

Поскольку вы создаете соединение, которое должно быть запланировано в цикле и запущено позже, убедитесь, что используется представление initWithRequest с параметром startImmediately, установленным в NO. Прямо сейчас, вы начинаете соединение дважды. И, что более важно, вы запускаете его до того, как запланировали его в главном цикле запуска.

Чтобы исправить это, укажите startImmediately как NO:

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[conn scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[conn start];

Сказав это, я не вижу необходимости отправлять этот код в фоновую очередь вообще (потому что initWithRequest работает асинхронно и не окажет заметного влияния на производительность приложения). Единственный раз, когда я использую вышеупомянутый шаблон, - это когда я упаковываю свои запросы NSURLConnection в некоторый пользовательский подкласс NSOperation (в этом случае приведенный выше шаблон очень полезен). Но в данном случае в этом нет необходимости.