Методы моего делегата никогда не вызываются, когда я использую connectionWithRequest: делегат - PullRequest
1 голос
/ 13 сентября 2009

Я делаю асинхронный POST-запрос в приложении для iPhone с помощью этого вызова:

    [NSURLConnection connectionWithRequest:req delegate:self];

Похоже, что запрос поступает на сервер просто отлично, но ни один из методов делегата не срабатывает. Я реализовал:

- (void)connection:(NSURLConnection *)connection didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

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

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

- (void) connectionDidFinishLoading:(NSURLConnection *)connection

и

- (void) connection:didFailWithError:(NSURLConnection *)connection 

Ни одно из сообщений журнала для этих методов никогда не появляется. Документация для соединения с запросом: делегат: говорит:

делегат

Объект делегата для соединения. Делегат будет получать сообщения делегата по мере загрузки. Сообщения делегату будут отправлены в потоке, который вызывает этот метод. Для правильной работы соединения цикл выполнения вызывающего потока должен работать в режиме цикла выполнения по умолчанию.

Я думаю, что вызов выполняется из основного потока (предполагается, что, если я не запустил новый поток явно, все работает в одном потоке правильно?), И я проверил поток следующим образом:

CFRunLoopRef loop = CFRunLoopGetMain();
CFStringRef modeString = CFRunLoopCopyCurrentMode(loop);
NSLog(@"The main loop is running in mode: %@", modeString);

Который создает этот вывод консоли:

2009-09-13 13: 32: 05.611 Стоковые видеозаписи [686: 20b] Основной цикл работает в режиме: kCFRunLoopDefaultMode

Похоже, что это режим работы цикла по умолчанию. Есть ли что-то еще, на что я должен обратить внимание, что может сказать мне, почему мои методы делегата не работают? Делегат определенно не умирает до того, как запрос будет выполнен.

Обновление: CFRunLoopGetCurrent имеет режим kCFRunLoopDefaultMode.

Обновление (17:40 по восточному): Ну, я переключился на использование initWithRequest: Delegate: startImmediately для того, чтобы запустить обратные вызовы, но я все еще хотел бы увидеть пример connectionWithRequest: делегат, который на самом деле хиты делегат вверх.

Ответы [ 2 ]

3 голосов
/ 26 июля 2010

У меня была похожая проблема. Причина, по которой мои делегаты не были вызваны, заключается в том, что после того, как я вызвал connectionWithRequest, я запустил цикл, который проверял, были ли отправлены данные из соединения. Поскольку я никогда не возвращал элемент управления в код RunLoop, сообщения, оставленные в очереди, никогда не обрабатывались, и поэтому методы делегата также не вызывались ... Просто убедитесь, что вы не делаете ничего тяжелого после вызова connectionWithRequest, и все должно работать хорошо.

1 голос
/ 13 сентября 2009

Две вещи выпрыгивают из меня:

  • У вас неправильный прототип для вашего метода ошибки (все равно должен вызываться):

connection: (NSURLConnection *) connection didFailWithError: (NSError *) error

  • Вам следует убедиться, что вы вернули правильное соединение с + connectionWithRequest:delegate:. Возможно, он даже не запускает запрос.
...