Потоки в Objective-C - PullRequest
       21

Потоки в Objective-C

6 голосов
/ 29 мая 2009

Есть ли темы в Objective C? Если да, то как они декларируются и используются?

Если кто-нибудь знает о многопоточности в Objective C, пожалуйста, поделитесь со мной.

Спасибо и всего наилучшего.

Ответы [ 5 ]

18 голосов
/ 29 мая 2009

Простой способ раскрутить метод в новом потоке - это использовать.

+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument на NSThread. Если вы не запускаете сборщик мусора, вам нужно настроить собственный пул автоматического выпуска.

Другой простой способ, если вы просто не хотите блокировать основной поток, - это использовать.

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

В зависимости от того, какой тип параллелизма вам нужен, вам также следует взглянуть на NSOperation, который может дать вам бесплатную блокировку, чтобы вы могли делить ее между несколькими потоками, среди прочего.

9 голосов
/ 29 мая 2009

Если вы разрабатываете с использованием Cocoa (то есть для Mac или iphone), у вас есть доступ к классу NSThread, который можно использовать для многопоточности. Поиск в Google по NSThread найдет вам API.

Вы можете объявить это как:

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

Где target и selector - это объект и селектор, с которого вы хотите начать поток, а аргумент - это аргумент, который нужно отправить селектору.

Затем используйте [Мифроч. Старт], чтобы запустить его.

6 голосов
/ 26 июня 2013

Да, в Задаче С. есть концепции многопоточности, и в задаче С. есть несколько способов достижения многопоточности.

1> NSThread

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

Это создаст новую тему в фоновом режиме. из вашей основной темы.

2> Использование executeSelector

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

выполнит задачу пользовательского интерфейса в вашем основном потоке, если вы вызовете это из фонового потока ... Вы также можете использовать

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

Который создаст фоновый поток.

3> Использование NSoperation

Перейдите по этой ссылке

4> Использование GCD

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

Будет callWebService в фоновом потоке и после его завершения. В основном потоке будет updateUI. Подробнее о GCD

Это почти весь способ многопоточности, который используется в iOS. надеюсь, это поможет.

3 голосов
/ 29 мая 2009

Вы также можете посмотреть в NSOperation

Чтобы увидеть пример этого, взгляните на сообщение Дрю МакКормака о MacResearch .

2 голосов
/ 26 февраля 2013

Прежде чем углубляться в такие вещи, как detachNewThreadSelector: обязательно ознакомьтесь с официальной документацией Apple. Для общего обзора параметров (включая очереди операций, очереди отправки и т. Д.) Есть Руководство по программированию параллелизма . И, чтобы взглянуть на более низкий уровень (и менее рекомендуемый) поток, есть Руководство по программированию потоков .

Вы определенно не хотите просто начинать раскручивать темы, не читая, что Apple сначала скажет по этому вопросу. Они проделали большую работу с такими вещами, как GCD , чтобы было проще и безопаснее писать параллельные программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...