2013-08-28 16 views
6

kładę całą didFinishLaunchingWithOptions z minimalnym kodu, który jest tutaj:iOS udało się uruchomić w czasie 0x000000008badf00d - opóźnienie w applicationDidBecomeActive

[UIApplication sharedApplication].idleTimerDisabled = YES; 
m_bDataLoadingNeeded = YES; 
return YES; 

W rezultacie musiałem kluczową inicjalizacji w applicationDidBecomeActive. Mimo to otrzymuję powyższy błąd.

Wszystkie odniesienia, o których mówię, wspominają o ukończeniu didFinishLaunchingWithOptions wcześniej, co zrobiłem. Czy jest wymagana kontrola dla applicationDidBecomeActive?

Mój dziennik katastrofy jest tutaj (jakoś nie mogę symbolicate jej wszelkie dsym i aplikacji na miejscu, więc nie mogę wiedzieć, które stwierdzenie jest dokładna winowajcą. Ale każdy widzi, że to na pewno nie didFinishLaunchingWithOptions)

Exception Type: 00000020 
Exception Codes: 0x000000008badf00d 
Highlighted Thread: 0 

Application Specific Information: 
<MyBundleID> failed to launch in time 

Elapsed total CPU time (seconds): 1.600 (user 1.600, system 0.000), 4% CPU 
Elapsed application CPU time (seconds): 0.438, 1% CPU 

Thread 0 name: Dispatch queue: com.apple.main-thread 
Thread 0: 
0 libsystem_kernel.dylib   0x3c66f0fc 0x3c65e000 + 69884 
1 libsystem_c.dylib    0x3c5b8124 0x3c5b7000 + 4388 
2 SystemConfiguration    0x360d43ca 0x360c0000 + 82890 
3 MyApp       0x001cd406 0xf9000 + 869382 
4 MyApp       0x001ccb78 0xf9000 + 867192 
5 MyApp       0x001cd148 0xf9000 + 868680 
6 MyApp       0x001d77e4 0xf9000 + 911332 
7 MyApp       0x001d7ed0 0xf9000 + 913104 
8 MyApp       0x001cd908 0xf9000 + 870664 
9 MyApp       0x001d46e0 0xf9000 + 898784 
10 MyApp       0x000fb870 0xf9000 + 10352 
11 UIKit       0x36177af6 0x36102000 + 482038 
12 UIKit       0x3615d9bc 0x36102000 + 375228 
13 UIKit       0x36105c34 0x36102000 + 15412 
14 UIKit       0x361056c8 0x36102000 + 14024 
15 UIKit       0x36105116 0x36102000 + 12566 
16 GraphicsServices    0x37dfb5a0 0x37df5000 + 26016 
17 GraphicsServices    0x37dfb1ce 0x37df5000 + 25038 
18 CoreFoundation     0x342d2170 0x3423b000 + 618864 
19 CoreFoundation     0x342d2112 0x3423b000 + 618770 
20 CoreFoundation     0x342d0f94 0x3423b000 + 614292 
21 CoreFoundation     0x34243eb8 0x3423b000 + 36536 
22 CoreFoundation     0x34243d44 0x3423b000 + 36164 
23 UIKit       0x3615c480 0x36102000 + 369792 
24 UIKit       0x361592fc 0x36102000 + 357116 
25 MyApp       0x000fb4be 0xf9000 + 9406 
26 MyApp       0x000fb474 0xf9000 + 9332 

Zważywszy applicationDidBecomeActive jest rzeczywiście winowajcą:

mogę przenieść moją applicationDidBecomeActive inicjalizacji wewnątrz wątku tła - coś zupełnie uproszczone like this, ale nie jestem pewien, co inne rzeczy muszę zrobić, b ponieważ ten kod inicjalizujący z kolei wewnętrznie odrodzi więcej wątków. Używam AFNetworking, Reachability i innych frameworków opartych na blokach. Nie wiem, czy skończę, robiąc tak wiele modyfikacji już zbudowanej architektury i wspólnego kodu.

Jestem bardzo zdezorientowany, jak rozwiązać ten problem w najlepszy i najkrótszy możliwy sposób.

+1

'0x8badf00d' ... typowe, dlaczego blokujesz główny wątek podczas uruchamiania? zadanie, które wymaga zbyt długiego czasu, musi zostać umieszczone w wątku tła. – holex

+1

Użyj instrumentów, aby znaleźć część kodu, która blokuje główny wątek i zoptymalizować go. Nie optymalizuj rzeczy, o których nic nie wiesz, może to pogorszyć sytuację. – Kerni

+0

Wiele rzeczy jest w rzeczywistości w tle, ale nie w taki sposób, w jaki widzę, np. Wywołania AFNetworking itp. Moje zamieszanie polega na tym, jak owijam całą tę rzecz w jeszcze jedno wywołanie w tle? Ponadto, naprawdę nie widzę żadnego słowa ostrożności dla applicationDidBecomeActive - zobaczyłem też, że jest on wywoływany po moim pierwszym viewdidLoad. –

Odpowiedz

5

Podejrzewam, że twój program robi kilka żądań sieciowych na głównym wątku, zanim będzie można go użyć - blokując użytkownika przez kilka sekund.

Wsteczne działanie nie jest (zawsze/koniecznie) ważne - Twoja aplikacja jest zabijana po upływie pewnego czasu .

Prawdopodobnie możesz po prostu uruchomić to w Instrumenty i zobaczyć, gdzie robisz rzeczy, które mogą zająć dużo czasu; I/O, żądania sieciowe - przenieś je z głównego wątku i wykonaj je asynchronicznie asynchronicznie. Oceniaj także hotspoty CPU. Początkowe czasy uruchomienia nie powinny być zbyt długie.

+1

+1 i dziękuję, ostatnio czytam rzeczy, które dotyczą tego, jak robić rzeczy w tle. Moje źródło nieporozumień było - nie było gwizdów przeciwko didBecomeActive, co było źródłem wypadku w moim przypadku.Niedawno wypróbuję instrumenty, aby zobaczyć wszystko, co mogę poprawić. –