2009-05-29 12 views
6

Czy wątki w Objective C? Jeśli tak, w jaki sposób są one deklarowane i używane?Threading w Objective-C

Jeśli ktoś wie o wielowątkowości w Celu C, proszę podziel się ze mną.

Dzięki i pozdrawiam.

Odpowiedz

9

Jeśli używasz Cocoa (np. Dla mac lub iphone), masz dostęp do klasy NSThread, która może być używana do wielowątkowości. Googling dla NSThread znajdzie dla ciebie API.

Można zadeklarować je jak przy użyciu:

NSThread *mythread = [[NSThread alloc] initWithTarget:target selector:selector object:argument]; 

Gdzie jest cel i selektor przedmiotu oraz selektor, który chcesz uruchomić wątku z, a argumentem jest argument, aby wysłać do selektora.

Następnie użyj [start mityth], aby go uruchomić.

18

W prosty sposób można po prostu wyłuskać metodę w nowym wątku.

+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument na NSThread. Jeśli nie używasz śmieci zebranych, musisz skonfigurować własną pulę autorelease.

Inną prostą drogą, jeśli po prostu nie chcesz blokować głównego wątku, jest użycie.

- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg na NSObject

W zależności od rodzaju współbieżności jesteś po należy również przyjrzeć NSOperation, które mogą dać ci wolnego zamek, dzięki czemu można go dzielić między kilka wątków między innymi.

3

Można również zajrzeć do NSOperation

Aby zobaczyć przykład tego, rzucić okiem na stanowisku Drew McCormack w sprawie MacResearch.

+0

NSOperation obsługuje tylko system iOS 4.0 lub nowszy. –

2

Zanim przejdziesz do rzeczy takich jak detachNewThreadSelector: koniecznie sprawdź oficjalną dokumentację Apple. Aby uzyskać ogólny przegląd opcji (w tym kolejek operacji, kolejek wysyłki itp.), Dostępny jest numer Concurrency Programming Guide. I, aby spojrzeć na wątki niższego poziomu (i mniej zalecane), jest Threading Programming Guide.

Na pewno nie chcesz po prostu zaczynać obracać wątków bez czytania, co Apple ma do powiedzenia na ten temat w pierwszej kolejności. Zrobili dużo pracy z takimi rzeczami jak GCD, aby ułatwić i bezpieczniej pisać programy współbieżne.

5

Tak są gwintowania koncepcje Cel C i istnieje wiele sposobów na uzyskanie wielu wątków w cel C

1>NSThread

[NSThread detachNewThreadSelector:@selector(startTheBackgroundJob) toTarget:self withObject:nil]; 

będzie to utworzenie nowego gwintu w tło. z Twojego głównego wątku.

2>Korzystanie performSelector

[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES]; 

wykona zadanie UI na głównym wątku, jeśli nazwać to z wątku tła ... Można również użyć

[self performSelectorInBackground:@selector(abc:) withObject:obj]; 

co stworzy wątek tła.

3>Korzystanie NSOperation

Follow this link

4>Korzystanie GCD

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     [self callWebService]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self updateUI]; 
     }); 
    }); 

Will callWebService w wątku tła i po jej zakończona. Będzie to updateUI w wątku głównym. More about GCD

To prawie cały sposób wielowątkowości, który jest używany w iOS. mam nadzieję że to pomoże.