iPhone: создание другой темы и выполнение некоторых процессов - PullRequest
2 голосов
/ 29 марта 2011

Я хочу создать отдельный поток из основного потока и выполнить там некоторые процессы. Например: когда я просматриваю экраны моего приложения (контроллер навигации, контроллер представления и т. Д.), Я также хочу иметь другой поток, в котором некоторые процессы загрузки должны выполняться в фоновом режиме.

Как мне добиться этого в разработке под iOS? Пожалуйста, ведите меня.

Спасибо!

Ответы [ 4 ]

7 голосов
/ 29 марта 2011

Есть много опций, слишком много, чтобы перечислять их полностью, но, возможно, самый простой способ заштриховать только один дополнительный поток - это executeSelectorInBackground: withObject: , например,

[self performSelectorInBackground:@selector(doSomething:) withObject:nil];

- (void)doSomething:(id)object
{
    NSLog(@"I'm running on a separate thread!");
}

Существует также executeSelectorOnMainThread: withObject: waitUntilDone: для передачи данных обратно в основной поток для UIKit и различных других средств диспетчеризации селекторов для определенных других потоков.

Вы можете напрямую поговорить с NSThread , если хотите настроить приоритеты или иным образом заштриховать нити более определенным образом. Будьте осторожны в любом случае, поскольку у вас не будет пула автоматического выпуска в фоновом потоке, если вы не создадите его самостоятельно.

Если вы планируете выпускать много потоков, вам, вероятно, следует отправить NSInvocationOperations в NSOperationQueue . Очереди работы гарантируют, что операции распределяются по фоновым потокам оптимальным образом для числа процессоров и ядер, которые есть на вашем устройстве.

Вы должны быть полностью уверены, что хотите фоновый поток, хотя. Как правило, если что-то может работать синхронно или асинхронно, отправляя сообщения в основной поток, последний является более эффективным способом, особенно с точки зрения срока службы батареи. Новые основанные на блоках асинхронные методы убирают много спагетти из написания кода, управляемого событиями, который должен выполнять простое линейное действие, так что, если вы хорошо придерживаетесь iOS 4 и выше, проверьте их.

2 голосов
/ 29 марта 2011

Вот фрагмент кода, с которого можно начать

    // start a new thread:
    [NSThread detachNewThreadSelector:@selector(onNewThread) toTarget:self withObject:nil];

- (void) onNewThread{
    // do stuff on new thread
}
0 голосов
/ 29 марта 2011

Если вы ориентируетесь на iOS 4.0+, я настоятельно рекомендую использовать ASIHTTPRequest и блоки.

- (IBAction)grabURLInBackground:(id)sender
{
   NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
   __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
   [request setCompletionBlock:^{
      // Use when fetching text data
      NSString *responseString = [request responseString];

      // Use when fetching binary data
      NSData *responseData = [request responseData];
   }];
   [request setFailedBlock:^{
      NSError *error = [request error];
   }];
   [request startAsynchronous];
}

Слепо прост в использовании и выполняет все запросы асинхронно (по умолчанию).

0 голосов
/ 29 марта 2011

Вы можете сделать это с NSOperation. Читайте об этом.

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