我可以用BOOL解决竞争条件吗?

时间:2017-10-26 14:03:50

标签: ios grand-central-dispatch

我有一个网络操作,在完成后调用一个块:

[[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    dispatch_async(dispatch_get_main_queue(), ^{
        // call this method's completion handler

为了开始我的应用,我想将其与一些UIView块动画一起运行以启动应用。在应用程序可以继续之前,必须同时看到用户动画并且必须完成网络操作。我希望同时发生这些异步事件,我尝试过这样的事情:

__block BOOL animationsDone=NO, networkDone=NO;

[self doUIViewBlockAnimations:^(BOOL finished) {
    animationsDone = YES;
    if (networkDone) [self startTheApp];
}];

[self doNetworkThing:^(id result) {
    networkDone = YES;
    if (animationsDone) [self startTheApp];
}];

这似乎运行正常,我认为它是安全的,因为这些块必须都在主队列上运行,所以我认为它们不能同时运行。但是我对这些东西有点不稳定(例如nonatomic所做的事情,即使我把它放在每个属性上)。

是否存在这两个块都完成的风险,但BOOL的状态在某种程度上混乱并且应用程序无法启动?这可能是一个难以理解的错误。

0 个答案:

没有答案