Рекомендованный слой ниток для iPhone? - PullRequest
1 голос
/ 11 августа 2009

Я новичок в Objective C и разработке для Mac ... Похоже, я могу использовать API потоков Posix в своем приложении. Это рекомендуемый способ? Или это какой-то Apple API, который я должен использовать вместо мьютексов, условных переменных и потоков?

Я должен добавить, что я разрабатываю для iPhone.

Я бы хотел добавить именно то, что я пытаюсь сделать. По сути, CoreLocation является асинхронным ... Вы говорите ему начать обновлять вас, а затем он просто периодически вызывает метод обновления для вас ...

Проблема, с которой я столкнулся, заключается в том, что мне нужен другой поток для блокировки до тех пор, пока не произойдет обновление ... Как сделать основной поток приложения заблокированным, пока не произойдет хотя бы одно обновление CoreLocation? Это NSConditionVariable? :)

Ответы [ 4 ]

6 голосов
/ 11 августа 2009

Я бы предложил еще более простой способ застрять в потоках, используя следующий вызов:

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

Это автоматически создаст новый фоновый поток для запуска. Кстати, убедитесь, что вы выполняете в фоновом методе следующее:

-(void) myMethod {
   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
   // code you want to run in background thread;
   [pool drain];
}

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

Наконец, говоря о блокировке основного потока, вы можете использовать следующее из фонового потока:

[self performSelectorOnMainThread:(@selector(myOtherMethod)) withObject:nil waitUntilDone:YES];

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

Надеюсь, это поможет!

2 голосов
/ 11 августа 2009

Это зависит от того, что вы пытаетесь сделать, но я бы начал с NSOperation и NSOperationQueue. Это позволяет довольно просто выполнять фоновые задачи. Взгляните на блог Дэйва Дрибина о параллельности NSOperation: http://www.dribin.org/dave/blog/archives/2009/05/05/concurrent_operations/

1 голос
/ 11 августа 2009

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

- (void)viewDidLoad {
    ...
    [myCLLocationManager beginUpdates];
    [self showLoadingIndicator];
    ....
}

- (void)locationManager:(CLLocationManager *)manager didReceiveUpdates {
    [self hideLoadingIndicator];
    // Additionally load the rest of your UI here, if you haven't already
}

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

1 голос
/ 11 августа 2009

Да, есть объект NSCondition, и он, вероятно, будет делать именно то, что вы хотите для упомянутого вами сценария CoreLocation.

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