2013-07-05 7 views
8

To jest pytanie typu "najlepsza praktyka" Nie mogę znaleźć dobrej odpowiedzi w Internecie. Tworzę statyczną bibliotekę kodu, która zapewnia między innymi kilka metod delegowania informacji o postępach.Czy moje metody delegatów na iOS powinny być zawsze zwracane w głównym wątku?

Biblioteka zarządza własnymi kolejkami, więc rzeczy takie jak pliki do pobrania nie są oczywiście wykonywane na głównym wątku, ale moje pytanie brzmi: czy powinienem zagwarantować, że moje metody delegatów są zawsze wywoływane w głównym wątku, czy dopuszczalne jest wywoływanie ich z poziomu wątki w kolejce, których używam? i polegać na programistach, którzy używają biblioteki, aby sprawdzić, czy jest w głównym wątku, jeśli chce robić aktualizacje UI w moich metodach delegatów?

Cheers, Sam

Odpowiedz

3

Możesz to zrobić w dowolny sposób; wystarczy to udokumentować.

Niektóre interfejsy API będą oddzwaniać do głównego wątku, niektóre do wątku (lub pętli run), które zostały użyte do rozpoczęcia pracy, a inne nie dają żadnych gwarancji. Niektóre z nich pozwalają nawet przejść do kolejki GCD, która jest używana dla wszystkich wywołań zwrotnych.

Pamiętaj, że delegate/callback może blokować się przez nietrwały czas, więc jeśli twoje API musi wznowić pracę tak szybko, jak to możliwe, z pewnością chcesz wysłać do innego wątku lub kolejki.

Powiedziawszy to wszystko, chyba że wydajność ma kluczowe znaczenie dla ciebie lub użytkowników twojego API, wybrałbym najwygodniejszą dla programisty, która byłaby głównym wątkiem.

+0

Dzięki za odpowiedź wydaje się, że "najlepsza praktyka" w tym przypadku naprawdę zależy od scenariusza. – Sammio2

+1

To naprawdę zależy. Ale polecam zawsze używać kolejki "wewnętrznych prywatnych" do wykonywania bloków klienta. Jest to jedyny niezawodny sposób na uniknięcie przypadkowej martwej blokady przez kod użytkownika podczas wywoływania dispatch_sync() gdzieś w bloku. – CouchDeveloper

+0

Dzięki, tak, używam wewnętrznych prywatnych kolejek w bibliotece. – Sammio2

-1

Oczywiście trzeba wywoływać metody przekazaniu, w głównym wątku, bo jeśli się nie mylę, wasze metody delegata zostanie przekazany do jakiegoś przedmiotu delegata (klasa użytkownika).

załóżmy, że pobierasz dane w kolejce, gdy dane zostaną pobrane, wywołasz metodę delegata, przekazując ją do określonego obiektu klasy użytkownika, więc musi to być główny wątek.

+0

Kiedy mówisz "oczywiście" ... Dlaczego to jest oczywiste? Metody delegatów nadal są przekazywane do obiektu delegata, nawet jeśli nie znajdują się w głównym wątku, oznacza to tylko, że klasa użytkownika musi upewnić się, że działa w głównym wątku, jeśli chce zaktualizować interfejs użytkownika. (FYI, to nie ja zrewanżowałem twoją odpowiedź!) – Sammio2

+0

Miałem na myśli, że jeśli opuściłeś to dla użytkownika, to robi użytkownika, aby przejść przez twój kod biblioteki, aby wiedzieć, czy powinien wezwać główny wątek lub inny. – Deepak

+0

Chociaż nie jestem geniuszem, ale jakiekolwiek jest moje doświadczenie, powinieneś ułatwić pracę użytkownikom z tą biblioteką (i wzniosłem twoje pytanie, czekam też na innych, odpowiedzcie, że podnieśliście to). – Deepak

0

Kiedy stworzyłem własnego menedżera pobierania, utrzymywałem metodę delegowania wywołując wątek wtórny, który uruchamiał instancje obiektów połączeń, ale to dlatego, że miałem "kontroler", który wysyłał bloki sukcesów w głównym wątku. Moim zdaniem zależy to od poziomu, na którym znajduje się biblioteka, jeśli uważasz, że w większości przypadków delegat wywoła metodę z podprocedurami obejmującymi obiekty UIKit, ponieważ nie są bezpieczne dla wątków, wybiorę ich wysłanie w głównym wątku. Jeśli uważasz, że po delegacie użytkownik twojej biblioteki może dokonać dalszego opracowania danych, zdecyduję się pozostać w innym wątku, ale wyraźnie to stwierdzam w dokumentacji. Jest jeszcze jeden punkt: prędkość, w zależności od trzech priorytetów, wątek wtórny może być naprawdę wolny.
[EDIT]
W menedżerze pobierania KVO lub powiadomieniu jest lepszym sposobem na obsługę połączeń, jak stwierdził Quinn, inżynier Apple w wideo WWDC.

+0

Dzięki za komentarze ... Po pierwsze, Quinn to legenda! Po drugie, moim problemem jest to, że moja biblioteka wykonuje znacznie więcej niż działanie jako menedżer pobierania, tak naprawdę menedżer pobierania jest komponentem biblioteki. Więc chciałem uniknąć używania KVO/powiadomień dla jednego aspektu i delegować metody na inne ... Ale poza tym, zgodziłbym się z tobą. – Sammio2

+0

Tak "Eskimo" jest superbohaterem, jest naprawdę miłym facetem, zawsze wyjaśnia rzeczy. – Andrea