Рекомендуемый слой резьбы для использования при разработке для iPhone?
-
12-09-2019 - |
Вопрос
Я новичок в Objective C и разработке для Mac...Похоже, я могу использовать API потоков Posix в своем приложении.Это рекомендуемый способ?Или вместо этого мне следует использовать какой-то Apple API для мьютексов, условных переменных и потоков?
Добавлю, что занимаюсь разработкой для iPhone.
Я хотел бы добавить именно то, что я пытаюсь сделать.По сути, CoreLocation является асинхронным...Вы говорите ему начать обновлять вас, а затем он просто периодически вызывает у вас метод обновления...
У меня проблема в том, что мне нужно заблокировать еще один поток до тех пор, пока не произойдет обновление...Как я могу заблокировать основной поток приложения до тех пор, пока не произойдет хотя бы одно обновление CoreLocation?Это NSConditionVariable?:)
Решение
Вместо того, чтобы блокировать пользовательский интерфейс и зависать, я бы предложил показывать какой-нибудь экран загрузки до тех пор, пока вы не получите первое обновление.Мог бы выглядеть примерно так:
- (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
}
Не цитируйте меня дословно по поводу этих вызовов методов, но именно так я предлагаю решить вашу проблему, по сути.
Другие советы
Я бы предложил еще более простой способ застрять в потоках — использовать следующий вызов:
[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];
Необязательный третий параметр будет удерживать основной поток, если вы этого захотите.
Надеюсь, это поможет!
Это зависит от того, что вы пытаетесь сделать, но я бы начал с NSOperation и NSOperationQueue.Это позволяет довольно просто передавать фоновые задачи.Взгляните также на сообщение в блоге Дэйва Дрибина о параллелизме NSOperation: http://www.dribin.org/dave/blog/archives/2009/05/05/concurrent_operations/
Да, есть объект NSCondition, и он, вероятно, будет делать именно то, что вы хотите для упомянутого вами сценария CoreLocation.