NSURLConnection (как часть AFNetworking) не вызывает делегат NSURLConnectionDataDelegate


Вопрос

Я использую AFNetworking, который генерирует объект NSURLConnection, чтобы загрузить фотографию.

NSURLConnection не делает никаких вызовов к

- (void)connection:(NSURLConnection __unused *)connection
   didSendBodyData:(NSInteger)bytesWritten
 totalBytesWritten:(NSInteger)totalBytesWritten
totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
Метод

. (Это часть протоколаNSURLConnectionDataDelegate , определенного в NSURLConnection.h)

Запрос представляет собой HTTP POST запрос с вложением фотографии (Content-Disposition "form-data", MIME-тип"image/jpeg"). Это должно (я думаю) привести к периодическому вызывает этот метод по мере выполнения загрузки.

Мне нужен метод, чтобы отобразить индикатор выполнения для пользователя. Однако метод не вызывается.

Примечание:

  • делегат установлен правильно; другие методы делегата вызываются
  • загрузка файла прошла успешно

AFNetworking Code

Я почти уверен, что это проблема NSURLConnection, а не AFNetworking.

Но на всякий случай, вот соответствующий код от моего AFHTTPClient подкласс:

NSMutableURLRequest *request = [self multipartFormRequestWithMethod:@"POST" path:path parameters:parameters constructingBodyWithBlock:constructor];
AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure];

if (constructor) {
    [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) {
        NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite);
    }];
}

[self enqueueHTTPRequestOperation:operation];

Мой подкласс AFHTTPClient не переопределяет ни один из методов, которые я вызываю:

  • multipartFormRequestWithMethod: path: parameters: constructingBodyWithBlock:
  • HTTPRequestOperationWithRequest: success: failure:
  • setUploadProgressBlock:
  • enqueueHTTPRequestOperation:

constructor является блоком с типом (void (^)(id<AFMultipartFormData>)) и не является nil (проверяется путем пошагового перебора кода).

Когда я набираю po operation.uploadProgress в отладчике, я вижу $0 = 0x1301d9f0 <__NSMallocBlock__: 0x1301d9f0>, поэтому я думаю, что блок устанавливается правильно.

Файл всегда загружается успешно, но код в блоке выполнения загрузки не запускается, поэтому мой индикатор выполнения никогда не обновляется.

Вопросы

Почему NSURLConnection не вызывает этот метод?

Каковы обстоятельства, при которых предполагается NSURLConnection? (Похоже, это не очень хорошо задокументировано.)

И самое главное, как я могу отобразить ход загрузки для пользователя?

2 3

2 ответа:

Библиотека, возможно, реализует метод connection:didSendBodyData:totalBytesWritten:totalBytesExpectedToWrite: в категории на NSObject. Это было бы очень неприятно, но это могло бы объяснить, почему метод AFURLConnectionOperation не вызывается.

Чтобы проверить это предположение, вы можете запустить class-dump на вашем скомпилированном двоичном файле. Найдите didSendBodyData: в выходных данных. Если есть совпадение в категории, библиотека явно несет ответственность. Библиотека также может быть связана со средой выполнения Objective-C, но это будет сложнее обнаружить, чем просто запустить класс-свалка.

Сторонняя библиотека отчетов об ошибках переопределяла этот метод делегата в NSURLConnection. Удаление библиотеки решило проблему. (Не было никаких проблем ни с AFNetworking, ни с NSURLConnection.)

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