2012-06-15 32 views
5

Moja aplikacja pobiera kilka zasobów z serwera, danych i deskryptorów danych. Te pobrania, uruchamiane przez akcje użytkownika, mogą być wykonywane jednocześnie, powiedzmy, do 50 pobrań na raz. Wszystkie te asynchroniczne zadania kończą się tworzeniem obiektów w pamięci (np. Dołączanie liści do struktur danych, takich jak dodawanie kluczy do edytowalnych słowników lub obiektów do tablic). Moje pytanie brzmi: czy to może powodować problemy ze stabilnością? Na przykład, jeśli kilka jednoczesnych zadań próbuje dodać klucze do tego samego słownika, czy mam poradzić sobie z sytuacją, umieszczając jakieś blokady? Jeśli zaimplementowałem cykl for, który szuka elementów graficznych w tablicy, czy możliwe jest, że inne uruchomione zadania mogą zmienić zawartość tablicy "podczas" cyklu? Jakieś referencje lub główne, ogólne wskazówki dotyczące tego wielozadaniowości, wielowątkowość inne niż oficjalna dokumentacja?iOS - Równoczesny dostęp do zasobów pamięci

Odpowiedz

1

Zależy od tego, jak masz do czynienia z pobraniami - jeśli korzystasz z NSURLConnection, to obsługuje on oddzielne wątki/współbieżność dla Ciebie i Twój kod jest powtórny, dzięki czemu nie musisz się martwić o jednoczesne działanie. Jeśli tworzysz własne wątki, potencjalnie masz problemy.

EDYCJA: Twój kod działa w głównym wątku (pętla głównego uruchomienia), powiedzmy, że masz NSURLConnection, który również działa, a następnie uruchomi się w osobnym wątku. Jednak Twój kod delegata, który zajmuje się zdarzeniami, które mają miejsce podczas połączenia, jest uruchamiany w pętli uruchamiania, a nie w innym wątku. Oznacza to, że twój kod może wykonywać tylko jedną rzecz naraz. Metoda połączenia zakończona pomyślnie nie zostanie wywołana jako w tym samym czasie jak każdy inny kod. Jeśli uruchomiłeś pętlę for, zablokowałoby to główny wątek, dopóki nie zakończyło się zapętlaniem, w międzyczasie, jeśli połączenie zostało zakończone, podczas gdy pętla for nadal działa, twój kod delegata nie zostanie wykonany, dopóki pętla nie zostanie zakończona.

+0

Tak, Używam NSURLConnection. Wyobraźmy sobie, że mamy cykl na tablicy zmiennych, co się stanie, jeśli inne zadanie (połączenie powiodło się) spróbuje dodać obiekt na końcu tablicy, podczas gdy cykl for jest wykonywany? Czy mógłbyś w tym przypadku podać krótki przykład kodu zwrotnego? – user236739

+0

Dodano jeszcze kilka zdań – Gruntcakes

+0

Fajnie, te nowe linie, gdzie naprawdę wyjaśniasz, dzięki. – user236739

1

Możesz zajrzeć do Grand Central Dispatch (GCD) i blokad barierowych. Bloki bariery pozwolą ci robić to, co chcesz w tle i "blokować" zasoby.

Zapoznaj się z dokumentacją Apple i postem Mike'a Ashusa na blogu here na GCD.

Podstawowym celem jest użycie kolejki współbieżnej, którą tworzysz, aby wykonać odczyty i blokadę blokującą dostęp do tego zasobu w celu zapisu. dobry towar.

Powodzenia

Tim