Вызов 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 ответ:
Поскольку вы создаете соединение, которое должно быть запланировано в цикле и запущено позже, убедитесь, что используется представление
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
(в этом случае приведенный выше шаблон очень полезен). Но в данном случае в этом нет необходимости.