Archiwum
- Listopad 2008 (2)
- Październik 2008 (2)
- Wrzesień 2008 (2)
- Sierpień 2008 (5)
- Lipiec 2008 (5)
- Czerwiec 2008 (3)
- Maj 2008 (1)
- Kwiecień 2008 (2)
- Marzec 2008 (3)
- Luty 2008 (9)
- Styczeń 2008 (2)
- Grudzień 2007 (2)
- Listopad 2007 (3)
- Październik 2007 (6)
- Wrzesień 2007 (8)
- Sierpień 2007 (5)
- Czerwiec 2007 (1)
- Maj 2007 (10)
- Kwiecień 2007 (5)
- Marzec 2007 (26)
- Luty 2007 (21)
- Styczeń 2007 (11)
- Grudzień 2006 (4)
- Listopad 2006 (9)
- Październik 2006 (6)
- Wrzesień 2006 (2)
- Lipiec 2006 (1)
- Czerwiec 2006 (13)
- Maj 2006 (2)
- Kwiecień 2006 (9)
- Marzec 2006 (1)
- Luty 2006 (2)
- Styczeń 2006 (17)
- Listopad 2005 (5)
- Październik 2005 (1)
- Sierpień 2005 (1)
- Lipiec 2005 (17)
- Czerwiec 2005 (2)
- Maj 2005 (4)
- Kwiecień 2005 (4)
- Marzec 2005 (7)
- Luty 2005 (20)
- Styczeń 2005 (24)
- Grudzień 2004 (21)
- Listopad 2004 (25)
- Październik 2004 (22)
- Wrzesień 2004 (38)
- Sierpień 2004 (5)
Kategorie
- Batalie (25)
- Emigracja (51)
- Komercha (4)
- Ogłoszenia (19)
- Ogólne (230)
- Opowiadacze (13)
- Pieprzenie (30)
- Podróże (23)
- Prasówka (6)
- Programowanie (42)
- Cocoa (14)
- iPhone (4)
- Mac OS X (17)
- Obj-C (12)
- Technikalia (21)
Czytam
Cocoa i wątki
Przez dłuższy czas zastanawiałem się, czy nadal używać POSIXowych wątków w swojej bibliotece, czy rzucić się na jakieś ciekawsze zastosowanie oryginalnych wątków Cocoa.
Dokumentacja na stronach Apple jest trochę lakoniczna, a i gugiel nie do końca pomaga. Zdecydowałem się więc rzucić trochę światła na ten banalniacki mechanizm.
Żeby odpalić nowy wątek musimy zrobić dwie podstawowe rzeczy. Mieć klasę która będzie miała metodę tego wątku (czyli takie coś, co będzie się pętlić i robić dziwne rzeczy, które są nam potrzebne) oraz użyć magicznej klasy NSThread.
Powiedzmy więc, że mamy klasę MojaKlasa i w niej metodę metodaWatku: . Nasza metoda powinna nie zwracać nic i przyjmować tylko jeden parametr typu id. Generalnie rzecz biorąc jest to strasznie podobniackie do funkcji puszczanej do pthread'a.
Żeby odpalić nasz nowy wątek wystarczy użyć jednej metody z klasy NSThread (metoda klasy, a nie obiektu, więc nic nie musimy tworzyć. Kod banalniacki podaję tutaj:
MojaKlasa *obiekcik = [[MojaKlasa alloc] init];
[NSThread detachNewThreadSelector: @selector(metodaWatku:) toTarget:obiekcik withObject: nil];
Co to zrobi? A mianowicie odpali w nowym wątku naszą metodę w podanym obiekcie obiekcik przekazując metodzie nil'a. Jeśli chcemy coś jej przekazać to podajemy to w ostatnim parametrze do metody detachNewThreadSelector:toTarget:withObject.
Mówiłem, że banalniackie :)
Jak zabić wątek? Zakończyć naszą metodę, albo wykonać metodę exit na obiekcie wątku (NSThread).
Oczywiście NSThread ma dodatkowo parę innych metod. Zarówno klasy jak i instancji. Pozwala na zidentyfikowanie w jakim wątku się aktualnie znajdujemy (metoda klasy currentThread) ustawianie priorytetu wątku i tym podobne pierdoły. Ale ogólnie rzecz biorąc całość jest przepotwornie prostacka.
Mimo wszystko spodziewałem się po kolegach z Apple trochę bardziej wyszukanych sposobów. Z drugiej strony oni się bardzo cieszą z tych selektorów, mimo że często dziedziczenie po ładnej klasie było by znacznie fajniejsze.
Smuggi
selectory sa miodzio… Pamietaj, ze Obj-C jest w pelni dynamiczny: mozliwosc podmieniania obiektow w czasie dzialania aplikacji itd. itd. W przeciwienstwie do C++, nie sa tworzone „sztywne” odwolania do metod danego obiektu – ale runtime w locie je wykonuje. Stad selectory sa bardzo uzyteczne: dana metode mozesz umiescic w obiekcie dowolnej klasy.
Po drugie: w Obj-C nie masz wielodziedziczenia. Wiec sam rozumiesz, jakie byloby to utrudnienie.
bazyl
Owszem, ale mnie jakos to nie przeszkadza, szczerze mowiac. Wielodziedziczenie jest brzydkie. A dynamiczne podmienianie obiektow w runtime to jest dopiero hack :)
Same selektory sa czasem ok, ale odpalanie selektorow jest kurewsko przekomplikowane. Ale to moje zdanie oczywiscie :)
kL
Dziedziczenie było by do d.., bo byś miał tylko jeden punkt startowy na klasę.
A tak dowolna klasa może wykonywać operacje wielowątkowo.
Do tego jak chcesz istniejącą klasę przerobić na wielowątkową, to tylko zmieniasz wywołanie metody i już – bez dotykania hierarchi klas i dodawania metod.


