2015-05-13 42 views
0

我有一個應用程序,它所做的第一件事是使用簡單的HTTP POST在一個API中註冊自己。我一直在func application(application: UIApplication, willFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?)這樣做,因爲Apple表示這是對URL調用的要求。因爲永不阻塞主線程很重要,所以這個調用是異步完成的。在應用程序啓動前獲取數據的策略

問題是,當它完成異步時,第一個屏幕打開並立即對API進行調用。由於這是快於第一API調用,第二個電話得到了401

爲了避免這種情況,我開始第二呼叫之前做了很俗氣的事情:

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

是否有更好的策略來做到這一點?我正在考慮在API的每次調用開始時使用dispatch_once,並在InformationFromFirstCall的回調中實現代碼。

這是否合理?

謝謝!

+4

爲什麼不放置加載屏幕並等待第一個註冊API調用完成? – jestro

+0

@jestro,這不是一個壞主意,但是我在第一個地方使用asyn的原因恰恰是不讓用戶等待,並讓他在後臺運行時體驗應用程序。 –

回答

0

而不是使用sleep的,你可以通過使用旗語節省CPU時間:

// 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語法。

相關問題