2016-02-25 33 views
10

Mam problem z AFNetworking w rozszerzeniu udziałów. W didSelectPost, dzwonię:Nieosiągnięcie powodzenia/niepowodzenia Oddzwanianie do rozszerzenia udziału za pomocą AFNetworking

[[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] korzysta z Singleton, aby uzyskać instancję AFHTTPSessionManager z NSURLSessionConfiguration zestawie z identyfikatorem tła.

Jednak wywołania zwrotne dotyczące powodzenia lub niepowodzenia nie są wywoływane i po prostu zawiesza się w nieskończoność, dopóki rozszerzenie nie zostanie zabite. Co ciekawe, żądanie HTTP kończy się dobrze po stronie serwera; ukończenie nigdy nie zostanie wywołane.

+0

dlaczego nie próbujesz nowej klasy AFN? –

+0

możesz zatrzymać się w debugerze i spojrzeć na wszystkie swoje stosy? zobacz, czy 2 z nich próbują wykonać tę samą blokadę. (lub blokady innych) – nielsbot

Odpowiedz

4

Domyślam się, problem nie jest z AFNetworking, ale problem dotyczy tej klasy singleton. Nie określiłeś architektury swojej aplikacji, ale zakładam, że możesz wywoływać wiele interfejsów API w różnych kontrolerach widoku, używając tego samego singletonu [AuthClient sharedClient] w tym samym czasie. W związku z tym, faktycznie otrzymujesz wywołanie success, ale nie dla powyższego połączenia, ale niektóre, gdzie indziej w kontrolerze. Dokładnie zmierzyłem się z moją aplikacją opartą na UITabbarController, w której wykonywałem wywołania API w viewDidLoad różnych kontrolerów widoku, a mój tester nieustannie zmieniał wszystkie zakładki. W związku z tym próbowałem uzyskać odpowiedź na pierwszy kontroler widoku (pierwsza zakładka) i wykorzystano do uzyskania odpowiedzi w drugim kontrolerze widoku (druga karta), co było błędem!

+0

Zgadzam się ... Może przykleić linię NSLog() w bloku sukcesu, aby sprawdzić, czy nie są wywoływane. Ponieważ używasz zmiennej instancji w singletonie, może istnieć tylko jeden kontekst rozszerzenia, więc jeśli jest możliwe, że połączenie może być w locie, gdy zostanie wywołane inne; wtedy tylko jedna rzecz będzie otrzymywać oddzwonienia. – Fiid

+0

Logowanie nie pomogło, ale problem dotyczył singletona. Nie poda szczegółów dotyczących konkretnej aplikacji, ale to postawiło mnie na dobrej drodze – iMack

1

1) Spróbuj wykonać tę prośbę w Postman, dla sprawdzenia właściwego sposobu i parametrów, jeśli OK -> 2.

2) Spróbuj użyć konfiguracji sesji jak ta

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; 

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

w tym punkt możemy założyć, że twój singletone został zainicjowany dla innego żądania z inną konfiguracją.

3) similar problem

4) about AFNetworking background

P.S. Spróbuj użyć prostego asynchronicznego na głównym wątku, z turbinki czekając odpowiedzi jako

1

Niektóre rzeczy chciałbym spróbować:

  • zrobic testow z śladu sieci; i upewnij się, że oczekiwane dane docierają do klienta.
  • Ustaw punkt wstrzymania i poszukaj zablokowanych wątków lub anomalii(należy rozważyć włamanie do samych interfejsów API Apple'a, np. CFNetworking lub NSURLSession itp.).
  • Sprawdź, czy bloki lambda/ukończenia są prawidłowo ustawione/zachowywane przez obiekt singletonowy/spróbuj zapisać prostą procedurę testową bez użycia singletonu, aby sprawdzić, czy robi on różnicę (na przykład poprzez ręczne tworzenie instancji klasy i używanie to).
  • Z fragmentu kodu nie jest jasne, czy moduł obsługi zakończonej sukcesem drukuje komunikat debugowania - warto rozważyć dodanie NSLog tam, gdzie jeszcze nie było w programie obsługi.

Mam nadzieję, że niektóre z nich przybliżą Cię do tego, co powoduje problem.