NSDefaultRunLoopMode vs NSRunLoopCommonModes

Drodzy dobrzy ludzie ze stackoverflow,]} Tak jak ostatnio, zadaję pytanie, na które ostatnio się natknąłem. Mam nadzieję, że ktoś mógłby rzucić na mnie trochę światła.

Kiedy próbuję ściągnąć duży plik za UIScrollView, MPMapView albo coś, proces pobierania zostaje zatrzymany, gdy tylko dotknę ekranu iPhone ' a. Na szczęście niesamowity post na blogu autorstwa Jörn sugeruje alternatywną opcję, używając NSRunLoopCommonModes do połączenia.

To pozwala mi przyjrzeć się szczegółom dwa tryby, NSDefaultRunLoopMode i NSRunLoopCommonModes, ale dokument apple nie wyjaśnia uprzejmie, poza powiedzeniem

NSDefaultRunLoopMode

Tryb radzenia sobie ze źródłami wejściowymi innymi niż obiekty NSConnection. Jest to najczęściej używany tryb run-loop.

NSRunLoopCommonModes

Obiekty dodane do pętli run używając tej wartości jako trybu są monitorowane przez wszystkie tryby run loop, które zostały zadeklarowane jako element zestawu Tryby "wspólne"; zobacz opis CFRunLoopAddCommonMode po szczegóły.

CFRunLoopAddCommonMode

Źródła, liczniki i obserwatorzy są rejestrowane w jednym lub więcej trybach run loop i uruchamiane tylko wtedy, gdy pętla run działa w jednym z tych trybów. Tryby wspólne to zestaw trybów run loop, dla których można zdefiniować zestaw źródeł, timerów i obserwatorów, które są współdzielone przez te tryby. Zamiast rejestrować źródło, na przykład, do każdego określonego trybu run loop, można może zarejestrować go raz do wspólnego pseudo-trybu run loop i zostanie automatycznie zarejestrowany w każdym trybie run loop w zestawie common mode. Podobnie, gdy tryb jest dodawany do zestawu trybów wspólnych, wszelkie źródła, timery lub obserwatory już zarejestrowane w pseudo-trybie wspólnym są dodawane do nowo dodanego trybu wspólnego.

Czy ktoś może wyjaśnić te dwie rzeczy w ludzkim języku?
Author: quantumpotato, 2011-08-28

1 answers

Pętla run jest mechanizmem, który pozwala systemowi budzić śpiące wątki, aby mogły zarządzać zdarzeniami asynchronicznymi. Zwykle podczas uruchamiania wątku (z wyjątkiem wątku głównego) istnieje opcja uruchamiania wątku w pętli run lub nie. Jeśli wątek uruchamia jakąś rodzaj lub długotrwałą operację bez interakcji z zewnętrznymi zdarzeniami i bez timerów, nie potrzebujesz pętli run, ale jeśli wątek musi reagować na nadchodzące zdarzenia, powinien być dołączony do pętli run aby obudzić wątek, gdy pojawią się nowe wydarzenia. Tak jest w przypadku NSURLConnection generowanych wątków, ponieważ budzą się one tylko przy przychodzących zdarzeniach (z sieci).

Każdy wątek może być powiązany z wieloma pętlami run lub może być powiązany z określoną pętlą run, która może być ustawiona na pracę w różnych trybach. "Run loop mode" jest konwencją używaną przez system operacyjny do ustalenia pewnych reguł dotyczących dostarczania określonych zdarzeń lub zbierania ich do dostarczenia później.

Zazwyczaj wszystkie pętle run są ustawione do "trybu domyślnego", który określa domyślny sposób zarządzania zdarzeniami wejściowymi. Na przykład: gdy tylko nastąpi zdarzenie przeciągania myszy (Mac OS) lub dotyku (na iOS), tryb dla tej pętli run jest ustawiony na śledzenie zdarzeń; oznacza to, że wątek nie zostanie obudzony przy nowych zdarzeniach sieciowych, ale zdarzenia te zostaną dostarczone później, gdy zdarzenie wejściowe użytkownika zakończy się i pętla run ponownie zostanie ustawiona na tryb domyślny; oczywiście jest to wybór dokonany przez architektów systemu operacyjnego, aby nadać priorytet zdarzeniom użytkownika zamiast wydarzeń w tle.

Jeśli zdecydujesz się zmienić tryb run loop dla Twojego wątku NSURLConnection, używając scheduleInRunLoop:forModes:, możesz przypisać wątek do specjalnego trybu run loop , zamiast określonej domyślnej pętli run. Specjalny pseudo-tryb o nazwie NSRunLoopCommonModes jest używany przez wiele źródeł wejściowych, w tym śledzenie zdarzeń. Na przykład przypisanie instancji NSURLConnection do trybu wspólnego oznacza przypisanie jej zdarzeń do "trybu śledzenia "oprócz"trybu domyślnego". Jedną z zalet/wad skojarzenie wątków z NSRunLoopCommonModes polega na tym, że wątek nie zostanie zablokowany przez zdarzenia dotykowe.

Nowe tryby mogą być dodawane do popularnych trybów, ale jest to dość operacja niskiego poziomu.

Chciałbym zakończyć dodając kilka notek:

  • Zazwyczaj musimy użyć zestawu obrazów lub miniatury pobrane z sieci z widokiem tabeli. Możemy pomyśleć, że pobieranie tych obrazów z sieci, podczas gdy widok tabeli jest przewijanie może poprawić wrażenia użytkownika (ponieważ mogliśmy zobaczyć zdjęcia podczas przewijania), ale nie jest to korzystne, ponieważ płynność przewijanie może bardzo cierpieć. W tym przykładzie z NSURLConnection pętla run nie powinna być używana; lepiej byłoby użyć metod delegate UIScrollView do wykrywania zakończenia przewijania, a następnie zaktualizować tabelę i pobrać nowe elementy z sieci;

  • Możesz rozważyć użycie GCD, które pomoże Ci "osłonić" Twój kod od problemów z zarządzaniem pętlą run. W powyższym przykładzie maj rozważ dodanie żądań sieciowych do niestandardowej kolejki szeregowej.

 172
Author: viggio24,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-06 16:59:27