2011-10-27 18 views
5

Rozdrabnianie sobie włosów z tego powodu, wszelkie myśli i sugestie będą bardzo mile widziane.performSelectorOnMainThread nie wykonuje

Mam obiekt, który wywołuje na sobie performSelectorOnMainThread:withObject:waitUntilDone: z wątku podrzędnego. Działa to dobrze w 95% przypadków. Co jakiś czas od czasu iOS i teraz do wydania, urządzenie odmawia wykonania połączeń performSelectorOnMainThread:withObject:waitUntilDone: ... Brak komunikatu o błędzie, nie ulega awarii, nie mogę spowodować, że urządzenie przejdzie w stan, w którym "zawiedzie "ale kiedy już się tam znajdzie, nadal kończy się niepowodzeniem, dopóki nie usuniemy i nie zainstaluję ponownie aplikacji, ani nie wymuszam jej zamknięcia, następnie dostosuję jej dodatek na usługi lokalizacyjne, a następnie uruchomę go ponownie, a następnie ponownie dostosuję usługi lokalizacyjne ponownie do normalności. .. ponowne uruchomienie urządzenia nie rozwiązuje go. Ponowna instalacja bez usuwania pierwszego nie rozwiązuje problemu. To bardzo dziwne ... Wiem, że działa przez większość czasu, ponieważ większość urządzeń nie ma problemów, jednak niektóre urządzenia zawodzą nieco regularnie (co 3-4 dni). Wiem, że to konkretnie to, że performSelectorOnMainThread:withObject:waitUntilDone: nie wywołuje tego, co powinien, ponieważ mam teraz wadliwe urządzenie i umieściłem NSLog w metodzie, która powinna zostać wywołana. Działa to dobrze, ale na uszkodzonym urządzeniu, gdy używa się metody performSelectorOnMainThread:withObject:waitUntilDone: do wywołania tej metody, NSLog pokazuje, że nie jest uruchamiany ...

To się zaczęło w przypadku iOS 5 betas i znowu dzieje się w momencie wydania. Zdarza się to najczęściej na 2 moich urządzeniach, ale na żadnym z pozostałych 10 urządzeń, które osobiście testowałem. Sądzę, że to było tylko moje urządzenie od jakiegoś czkawki w wersji beta, ale dzieje się to na moim nowym 4S, który nigdy nie dotknął beta, a także na iPadzie 2 jednego użytkownika (nie na moim iPadzie 2).

Naprawdę nie wiem, gdzie szukać. Mówię, aby to wykonać i zwykle działa na prawie każdym urządzeniu, ale ta sama linia nie otrzymuje odpowiedzi i nie ma błędów itp. Na niektórych ...

+0

Czy używasz CoreData przez przypadek? Miałem podobny problem. To, co się naprawdę dzieje, to zakleszczenie wątku czekającego na wykonanie operacji odczytu przy użyciu CoreData, podczas gdy inny wątek próbował napisać. – picciano

+0

@picciano jak sobie z tym poradziłeś? Mam ten sam problem i nie mogę wymyślić, co muszę zrobić, aby naprawić impas. –

Odpowiedz

3

performSelectorOnMainThread: withObject: waitUntilDone może czasami być nieciągły. Czy myślałeś o próbie użycia wysyłki do biblioteki?

Można utworzyć blok i umieścić go w głównym wątku jak ten:

dispatch_async(dispatch_get_main_queue(), ^{ 
    <do work here> 
}); 

Miałoby to samo chyba wpłynąć jak korzystając performSelectorOnMainThread:withObject:waitUntilDone http://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html#//apple_ref/doc/uid/TP40008091-CH102-SW1

0

RunLoop ma kilka różnych trybów wątku jest. Możliwe jest, że w czasie rozmowy telefonicznej główny wątek jest uruchomiony w trybie innym niż domyślny (co jest jednym kierowane przez performSelectorOnMainThread:withObject:WaitUntilDone:.

Rozważ użycie performSelectorOnMainThread:withObject:waitUntilDone:modes:
Zobacz Apple's documentation.

również - GCD (libdispatch) jest niesamowite, ale nie chroni przed gotowaniem sobie impasu: Rozważmy przypadek, w którym metoda jest uruchomiony w głównym wątku i dzwonisz:

dispatch_sync(dispatch_get_main_queue(), ^{ 
    <do work here> 
}); 
Powiązane problemy