Ios 应用程序发布前获取数据的策略

Ios 应用程序发布前获取数据的策略,ios,swift,grand-central-dispatch,Ios,Swift,Grand Central Dispatch,我有一个应用程序,它做的第一件事就是用一个简单的HTTP POST在API中注册自己。我一直在func应用程序(application:UIApplication,willFinishLaunchingWithOptions launchOptions:[NSObject:AnyObject]?),正如苹果公司所说,这是URL调用的关键。因为永远不要阻塞主线程很重要,所以此调用是异步完成的 问题是,当异步完成时,第一个屏幕打开,对API的调用立即完成。因为这比第一个API调用快,所以第二个调用得

我有一个应用程序,它做的第一件事就是用一个简单的HTTP POST在API中注册自己。我一直在
func应用程序(application:UIApplication,willFinishLaunchingWithOptions launchOptions:[NSObject:AnyObject]?)
,正如苹果公司所说,这是URL调用的关键。因为永远不要阻塞主线程很重要,所以此调用是异步完成的

问题是,当异步完成时,第一个屏幕打开,对API的调用立即完成。因为这比第一个API调用快,所以第二个调用得到401

为了避免这种情况,在开始第二次通话之前,我做了一件非常俗气的事情:

dispatch_async(dispatch_get_global_queue(priority, 0)) {
    // do some task
    while (InformationFromFirsCall == nil)
    {
        sleep(1)
    }
}
有没有更好的策略来做到这一点?我在考虑在每次调用API时使用一次
dispatch\u
,并在InformationFromFirstCall的回调中实现代码

这合理吗


谢谢

不使用
睡眠
,您可以通过使用信号量节省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\u semaphore\u wait
会导致当前线程挂起,直到信号量的值变为非零,这在调用
dispatch\u semaphore\u signal
时发生

有关更多详细信息,请参阅


注:这是C代码;如果您使用Swift编写应用程序,则需要将其调整为Swift语法。

为什么不设置加载屏幕,等待第一个注册API调用完成?@jestro,这不是一个坏主意,但我之所以使用asyn,一开始就是为了不让用户久等,让他在后台运行时体验应用程序。