Запустить метод в главном потоке из другого потока - PullRequest
6 голосов
/ 04 февраля 2011

Мой класс модели должен получить некоторые данные из Интернета.Поэтому я решил запустить его в другом потоке, чтобы пользовательский интерфейс не зависал.Поэтому, когда объект хочет получить какие-либо данные, он сначала запрашивает модель, используя метод такого типа:

- (void)giveMeSomeData:(id)object withLabel:(id)label {
objectAsking= object;
theLabel= label;
NSThread* thread= [[NSThread alloc] initWithTarget:self selector:@selector(getTheDataFromInternet) object:nil];
[thread start];
}

- (void)getTheDataFromInternet {
//getting data...

theData= [dataFromInternet retain]; //this is the data the object asked for
[self returnObjectToAsker];
}

- (void)returnObjectToAsker {
[objectAsking receiveData:theData withLabel:theLabel];
}

Поскольку я все еще новичок, вы можете сказать мне, хороший ли это шаблон?

Спасибо!

1 Ответ

12 голосов
/ 04 февраля 2011

Ваши настройки в значительной степени верны. Вы никогда не захотите инициировать какое-либо сетевое соединение в главном потоке.

В текущем состоянии -returnObjectToAsker будет выполняться в фоновом потоке.

Возможно, вас заинтересует -[NSObject performSelectorOnMainThread:withObject:waitUntilDone:].

Или, если вы хотите что-то с Grand Central Dispatch (iOS 4+, Mac OS X 10.6+), вы можете сделать:

#import <dispatch/dispatch.h>

- (void)giveMeSomeData:(id)object withLabel:(id)label {
    dispatch_async(dispatch_get_global_queue(0,0), ^{
      //this runs on a background thread
      //get data from the internet
      dataFromTheInternet = ...;
      dispatch_async(dispatch_get_main_queue(), ^{
        [object receiveData:dataFromTheInternet withLabel:label];
        //this runs on the main thread.  Use theData
      });
    });
}

Поскольку блоки захватывают свое окружение, вам даже не придется экономить на object и label в иварах. :)

...