2015-05-13 5 views
0

У меня есть приложение, первое, что он делает, это зарегистрировать себя в API с простой HTTP POST. Я делал это в func application(application: UIApplication, willFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?), так как Apple заявляет, что это точка для вызовов URL. Поскольку важно никогда не блокировать основной поток, этот вызов выполняется async.Стратегия получения данных перед запуском приложения

Проблема заключается в том, что, как это делается async, открывается первый экран и сразу же выполняется вызов API. Так как это быстрее, чем при первом вызове API, то второй вызов получает 401.

Для того, чтобы избежать этого, я делаю очень сырную вещь, прежде чем начать второй вызов:

dispatch_async(dispatch_get_global_queue(priority, 0)) { 
    // do some task 
    while (InformationFromFirsCall == nil) 
    { 
     sleep(1) 
    } 
} 

Есть лучшая стратегия для этого? Я думал об использовании dispatch_once в начале каждого вызова API и реализации кода внутри обратного вызова InformationFromFirstCall.

Это разумно?

Спасибо!

+4

Почему бы не поставить экран загрузки и дождаться завершения первого вызова API регистрации? – jestro

+0

@jestro, это неплохая идея, но причина, по которой я использую asyn на первом месте, - это не то, чтобы не допустить, чтобы пользователь ждал и позволял ему испытать приложение, когда все работает на заднем плане. –

ответ

0

Вместо использования sleep, вы можете сэкономить время процессора с помощью семафора:

// declared somewhere where you can access it 
dispatch_semaphore_t sema; 

// willFinishLaunching 
sema = dispatch_semaphore_create(0); 

// when your async call completes 
dispatch_semaphore_signal(sema); 

// in your main UI — this is the same as the sleep call you have, but doesn't waste CPU time 
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 

Семафор является эффективным механизмом для выгонки одной части вашего приложения, чтобы ждать, пока другое приложение делает что-то - вызов до dispatch_semaphore_wait заставляет текущий поток зависать, пока значение семафора не станет ненулевым, что происходит, когда вызывается dispatch_semaphore_signal.

Для получения более подробной информации см. this answer.

Примечание: это код C; вам нужно будет адаптировать его к синтаксису Swift, если вы кодируете свое приложение в Swift.

Смежные вопросы