在应用启动之前获取数据的策略

时间:2015-05-13 02:29:03

标签: ios swift grand-central-dispatch

我有一个应用程序,它首先做的是通过一个简单的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的回调中实现代码。

这样合理吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用信号量来节省CPU时间,而不是使用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语法。