2017-01-11 27 views
6

Moja aplikacja korzysta z UIBackgroundMode, tj. Jest ponownie uruchamiana przez iOS, gdy zdarzenia Bluetooth występują nawet wtedy, gdy aplikacja nie jest aktywna. Dlatego zdarzenia Bluetooth są wywoływane przez iOS na kolejkę tła (kolejka jest określona przeze mnie).Czy kolejka główna jest wywoływana po ponownym uruchomieniu aplikacji w tle?

mogę jednak kod wysyłka z powrotem do głównego kolejki, czyli

DispatchQueue.main.async { } (Swift)

dispatch_async(dispatch_get_main_queue(), ^{ }) (Objective-C)

i zakładamy, że jego pętla prowadzony jest uruchomiony, to jest moje bloki zostaną wysłane? Czy też główna kolejka zawieszona jest w tle, a zatem powinienem unikać dodawania do niej bloków dyspozytorskich?

+0

Czy próbowałeś zrobić to samo. –

+0

Przeprowadziłem eksperyment, w którym iOS wydaje się uruchamiać główną pętlę, ponieważ bloki są wykonywane, gdy aplikacja została uruchomiona w tle. Nie mogę jednak zakładać, że iOS zachowuje się w ten sposób. Jeśli nadal będzie działać główna pętla, znacznie ułatwi mi to moją aplikację, ponieważ wtedy nie potrzebuję synchronizacji wątków, ponieważ w razie potrzeby wysyłam ją do głównej kolejki. –

Odpowiedz

3

Powinno być bezpieczne przesyłanie do głównej kolejki w tle.

Gdy aplikacja działa w tle, wszystko, co robi, jest technicznie wykonywane na wątkach działających w tle, ponieważ system oznacza twoją aplikację jako niższy priorytet. Jednak aby system mógł uruchomić twój kod, musi przynajmniej mieć główną kolejkę. Dlatego można bezpiecznie założyć, że będziesz miał dostęp do głównej kolejki. Jeśli chcesz, możesz stamtąd tworzyć inne kolejki robocze, ale najprawdopodobniej wszystko zostanie przesunięte na jeden wątek tła w celu wykonania, więc możesz nie zauważyć wielu korzyści.

Należy również pamiętać, że testowanie wątków w tle może być nieco trudne. Nici w tle będą zawsze wykonywane i zdają się nigdy nie być wyłączane podczas działania symulatora. To samo dzieje się podczas testowania na urządzeniu, jeśli Xcode jest podłączony i debugowania. System pozwala również na nieprzerwaną pracę aplikacji przez 10 minut (ostatnio sprawdziłem, możliwe, że zmieniło się to w ciągu ostatniego roku lub dwóch) po wprowadzeniu tła, jeśli to konieczne, a po jego zakończeniu będzie wymagane coś takiego jak wydarzenie bluetooth, o którym wspomniałeś, aby uzyskać dodatkowe czas w tle.

Źródło: Niefortunne doświadczenie w pracy z aplikacjami w tle.

+0

Czy jesteś pewien około 10 minut? Dokumentacja mówi, że aplikacje mają 10 _seconds_ podczas przełączania się w tryb tła, zanim zostaną zawieszone. –

+1

Ahh w prawo, 10 sekund, chyba że masz działającą usługę w tle (jak aktualizacje lokalizacji), w tym momencie myślę, że system pozwoli, aby aktualizacje lokalizacji były kontynuowane przez maksymalnie 10 minut. Chyba, że ​​coś innego daje Twojej aplikacji więcej czasu w tle, na przykład znaczącą zmianę lokalizacji lub aktualizację bluetooth. Najważniejsze jest to, że podczas budowania aplikacji w tle trzeba być przygotowanym na wyłączenie w dowolnym momencie. – esthepiking

Powiązane problemy