2014-09-05 15 views
6

Dlaczego połączenie z NSURLSession przez jego konfigurację trwa tak długo, że spowodowałoby awarię aplikacji podczas uruchamiania: "nie udało się uruchomić w czasie"?Dlaczego połączenie z powrotem do systemu iOS NSURLSession trwa zbyt długo, czekając na blokadę, powodując awarię aplikacji?

Widziałem podobne zrzuty w wielu aplikacjach na iOS, w tym aplikację NY Times iOS i aplikację Evernote.

[NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:queue] 

Oto ślad stosu:

Thread 0: 
0 libsystem_kernel.dylib   0x3afb7aa0 semaphore_wait_trap + 8 
1 libdispatch.dylib    0x3af04d3d _dispatch_semaphore_wait_slow + 173 
2 CFNetwork      0x2febd8e3 -[__NSCFBackgroundSessionBridge setupBackgroundSession] + 379 
3 CFNetwork      0x2fef18a1 +[__NSCFSessionBridge bridgeForConfiguration:session:queue:] + 153 
4 CFNetwork      0x2fef6497 -[__NSCFURLSession initWithConfiguration:delegate:delegateQueue:] + 395 
5 CFNetwork      0x2fef6eb7 +[__NSCFURLSession sessionWithConfiguration:delegate:delegateQueue:] + 295 
+0

Mam również ten sam problem z dokładnym śledzeniem stosu. Nie można znaleźć przyczyny źródłowej. @Rayyan, czy byłeś w stanie rozwiązać problem? – kkumpavat

+0

Poruszałem się, aby uruchomić asynchronicznie w wątku w tle, aby system operacyjny nie zakończył aplikacji z powodu tego. Jednak wywołanie sessionWithConfiguration zawiesza się i nigdy nie wraca. Zdarza się to rzadko, ale gdy urządzenie przechodzi w zły stan, stale zawiesza się na tym urządzeniu. @kkumpavat, czy to też widzisz? Podejrzewam, że to błąd w iOS. – Rayyan

+0

Tak, podejrzewam też, że jest to błąd w iOS. Zdarza się to rzadko i kiedy iOS dostaje się do tego złego stanu, wykonanie zawiesza się na "sessionWithConfiguration: delegate: delegateQueue:" za każdym razem. Również wywołanie funkcji asynchronicznej nie pomaga, ponieważ sesja nigdy nie zostanie zainicjalizowana i nie będziemy w stanie wykonać zadania sieciowego. – kkumpavat

Odpowiedz

1

Zobacz Application Specific Information: Application failed to launch in time (iOS)?.

Zasadniczo istnieją 2 rzeczy, o których należy pamiętać:

  1. Po uruchomieniu masz tylko kilka sekund, aby zakończyć procedurę startową. Każdy działający kod powinien zostać wywołany asynchronicznie po uruchomieniu aplikacji.

  2. Upewnij się, że w głównym wątku jest wywoływany dowolny kod interfejsu użytkownika w swoich blokach wywołań/blokach/zamknięciach. Musisz to zmusić, aby to zrobić.

+0

@ henry-asseily, dzięki, to ma sens i zgadzam się z Twoimi wytycznymi. Dla mnie niejasne jest to, dlaczego sessionWithConfiguration: delegate: delegateQueue: API zajmuje bardzo dużo czasu, musi być asynchroniczne, aby nie utrzymywało aplikacji po uruchomieniu. Semantyka tego API nie sugeruje, że może to być długotrwałe połączenie, ale być może czegoś brakuje. – Rayyan