Рекомендуемый слой резьбы для использования при разработке для iPhone?

StackOverflow https://stackoverflow.com/questions/1261703

Вопрос

Я новичок в 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top