NSProgress fractionCompleted метод наблюдения за ключом, который не называется

Я пытаюсь отслеживать ход моего HTTP-запроса, используя AFNetworking и NSProgress. В принципе, мой запрос представляет собой многочастную форму данных, которая содержит текстовые параметры и данные изображения, все в одном блоке.

Это мой код для задачи загрузки, и для меня это выглядит довольно просто и нормально:

NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"<THE_API_URL>" parameters:nil constructingBodyWithBlock:constructionBlock]; AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; manager.responseSerializer = [AFHTTPResponseSerializer serializer]; NSProgress *progress = [[NSProgress alloc] initWithParent:nil userInfo:nil]; [progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:NULL]; NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { if (error) { // UI reacts to error } else { // Do stuff here } }]; [uploadTask resume]; 

Теперь я не понимаю, что метод наблюдателя обратного вызова не вызывается, даже если задача загрузки завершена и преуспевает. Может кто-нибудь помочь мне понять, почему? Вот мой код.

 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; if ([keyPath isEqualToString:@"fractionCompleted"] && [object isKindOfClass:[NSProgress class]]) { NSProgress *progress = (NSProgress *)object; NSLog(@"Progress is: %f", progress.fractionCompleted); } } 

UPDATE: я выполнил код uploadTaskWithStreamedRequest:... метода uploadTaskWithStreamedRequest:... и обнаружил, что они фактически заменяют мой объект uploadTaskWithTask:... изнутри uploadTaskWithTask:... Естественно, если указатель NSProgress сделан для указания на новый экземпляр, этот новый экземпляр не регистрируется для наблюдения свойства fractionCompleted . Как я могу выполнять наблюдение за ключевыми значениями на этом новом экземпляре NSProgress без изменения кода AFNetworking?

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

 NSProgress *progress; NSURLSessionUploadTask *uploadTask = [manager uploadTaskWithStreamedRequest:request progress:&progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { if (error) { // UI reacts to error } else { // Do stuff here } }]; [uploadTask resume]; [progress addObserver:self forKeyPath:@"fractionCompleted" options:NSKeyValueObservingOptionNew context:NULL]; 

Я отказался от этого метода отслеживания прогресса от AFURLSessionManager . Вместо этого я использовал добрую старую AFHTTPRequestOperation .

 NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:@"THE_API_URL" parameters:nil constructingBodyWithBlock:constructionBlock]; AFHTTPRequestOperation *requestOperation = [[AFHTTPRequestOperationManager manager] HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) { // Do stuff here } failure:^(AFHTTPRequestOperation *operation, NSError *error) { // Catch error }]; [requestOperation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { double percentDone = (double)totalBytesWritten / (double)totalBytesExpectedToWrite; progressBlock(percentDone); }]; [requestOperation start]; 

Вы можете столкнуться с этой проблемой, https://github.com/AFNetworking/AFNetworking/issues/1398 , что на самом деле связано с ограниченным дизайном в NSURLSession. К концу обсуждения вы увидите предлагаемое решение. Я использую это обходное решение, и наблюдение за «fractionCompleted» отлично подходит для меня.

-Брайан

  • Только ресурс NSBundle: это кошерный?
  • Как прокрутить UIScrollView при загрузке при использовании автоматической компоновки
  • Ограничить разрешения при доступе к Facebook с использованием структуры учетных записей
  • Недействительность NSTimer в dealloc
  • Повторное использование UIViewController для модальных и немодальных ситуаций
  • Как использовать UIViewControllerAnimatedTransitioning с UINavigationController?
  • iOS, используя знак подчеркивания vs с использованием iVar непосредственно
  • ApplicationIconBadgeNumber не получает сброс при переустановке моего приложения ipad.
  • Создание кнопки Вызов номера телефона в iOS
  • Изменения цвета клавиатуры iOS - keyboardAppearance темный цвет не прилипает
  • Могу ли заставить MPMoviePlayerController к пейзажу при нажатии на полноэкранную кнопку в iOS
  • Interesting Posts

    Как отправить NSString на другой контроллер представления

    Как программно добавлять многоразовые пользовательские представления? (Swift)

    Сохранение содержимого UIWebView в формате A4

    NSURLConnection и базовая HTTP-аутентификация в iOS

    iOS: AVQueuePlayer / AVPlayerItem «AVPlayerItem может занимать только одну позицию в очереди игрока за раз».

    Когда вы просыпаетесь от уведомления о значительном изменении местоположения, сколько времени у меня есть в фоновом режиме?

    Как поделиться текстом и изображением на стене facebook (цель C)

    В приложениях iOS какая разница между основным пакетом и каталогом документов?

    Область касания UIButtons изменяется, когда отображается строка состояния вызова

    Как изменить цвет шрифта / Цвет текста в UIBarButtonItem на панели навигации

    Как установить непрочитанное или прочитанное сообщение с использованием API Gmail с использованием SDK цели?

    Как обрабатывать видеообъявления YouTube (запущенные, завершенные и т. Д.) В iOS iOS

    Admob не загружается при использовании пользовательского агента пользователя

    Приложение разрешено только для портрета, но UIImagePickerController вращается в iOS6

    Извлечение изображения CKAsset из CloudKit очень медленно

    Давайте будем гением компьютера.