Не удается получить успешные / неудачные обратные вызовы для расширения общего ресурса с использованием AFNetworking

У меня небольшая проблема с AFNetworking в расширении общего доступа. В didSelectPost звоню:

[[AuthClient sharedClient] POST: @"/v1/events"
    parameters: params success: ^ (AFHTTPRequestOperation * operation, id responseObject) {
        [self.extensionContext completeRequestReturningItems: nil completionHandler: nil];
    }
    failure: ^ (AFHTTPRequestOperation * operation, NSError * error) {
        NSLog(@"error: %@", error);
        [self.extensionContext cancelRequestWithError: error];
    }
];

[AuthClient sharedClient] использует шаблон singleton для получения экземпляра AFHTTPSessionManager с NSURLSessionConfiguration, установленным с идентификатором фона.

Однако ни успешные, ни неудачные обратные вызовы не вызываются, и он просто зависает на неопределенное время, пока расширение не будет уничтожено. Интересно, что HTTP-запрос завершается нормально на стороне сервера; завершение просто никогда не вызывается.


person iMack    schedule 25.02.2016    source источник
comment
почему бы вам не попробовать новый класс AFN?   -  person Nitin Gohel    schedule 02.03.2016
comment
можно сделать паузу в отладчике и посмотреть на все свои стеки? посмотрите, не пытаются ли двое из них взять один и тот же замок. (или чужие замки)   -  person nielsbot    schedule 02.03.2016


Ответы (3)


Думаю, проблема не в AFNetworking, а в этом одноэлементном классе. Вы не указали архитектуру своего приложения, но я предполагаю, что вы можете вызывать несколько API в разных контроллерах представления, используя один и тот же [AuthClient sharedClient] синглтон одновременно. Следовательно, вы фактически получаете вызов success, но не для указанного выше вызова, а где-то еще в вашем контроллере. Я столкнулся с точной проблемой в моем приложении на основе UITabbarController, когда я делал вызовы API в viewDidLoad различных контроллерах представления, а мой тестер постоянно менял все вкладки. Таким образом, я пытался получить ответ для первого контроллера представления (1-я вкладка) и использовал для получения ответа во втором контроллере представления (2-я вкладка), что было неправильно!

person Hemang    schedule 02.03.2016
comment
Согласитесь ... Возможно, вставьте строку NSLog () в блок успеха, чтобы убедиться, что они не вызываются. Поскольку вы используете переменную экземпляра в синглтоне, может быть только 1 контекст расширения, поэтому, если возможно, что вызов может быть в полете, когда запускается другой; тогда будет только одна вещь, получающая обратные вызовы. - person Fiid; 07.03.2016
comment
Ведение журнала не помогло, но проблема была в синглтоне. Не буду вдаваться в подробности, связанные с конкретным приложением, но это наставило меня на правильный путь - person iMack; 09.03.2016

1) Попробуйте выполнить этот запрос в Postman, чтобы проверить правильность и параметры, если все в порядке -> 2.

2) Попробуйте использовать такую ​​конфигурацию сеанса

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];

// Initialize Session Manager
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:sessionConfiguration];

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

3) ​​аналогичная проблема

4) о предыстории AFNetworking

P.S. Попробуйте использовать простой асинхронный режим в основном потоке со счетчиком во время ожидания ответа

person Mr.Fingers    schedule 04.03.2016

Некоторые вещи, которые я бы попробовал:

  • Выполните проверку работоспособности с помощью трассировки сети; и убедитесь, что ожидаемые данные доходят до клиента.
  • Установите точку останова и найдите любые заблокированные потоки или аномалии (даже подумайте о взломе самих сетевых API Apple, например CFNetworking или NSURLSession и т. Д.).
  • Убедитесь, что блоки лямбда / завершения правильно устанавливаются / сохраняются вашим одноэлементным объектом / попробуйте написать простую процедуру тестирования без использования одноэлементного объекта, чтобы увидеть, имеет ли это значение (например, вручную создав экземпляр класса и используя его).
  • Из фрагмента не ясно, распечатывает ли обработчик успешного завершения сообщение отладки - подумайте о добавлении туда NSLog, если его еще нет в обработчике.

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

person kvr    schedule 08.03.2016