我有一个应用程序,它首先做的是通过一个简单的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的回调中实现代码。
这样合理吗?
谢谢!
答案 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语法。