使用dispatch_async返回bool值

时间:2013-09-03 18:07:38

标签: iphone ios grand-central-dispatch

这次简单的问题,我在我的新应用程序中创建了一个“实用程序”类,它帮助我在不同的UIVIewController中调用方法。

我使用类功能。但我面临一个新问题,我必须检查icloud是否可用,我使用:

+ (BOOL)isIcloudAvailable {

    BOOL isBothIcloudenabled = NO; 

    BOOL isIcloudAvailable = NO;


    NSURL *ubiq = [[NSFileManager defaultManager]
                   URLForUbiquityContainerIdentifier:nil];
    if (ubiq) {
        isIcloudAvailable = YES; 
    } else {
        isIcloudAvailable = NO; 
    }

    NSUserDefaults *aUseriCloud = [NSUserDefaults standardUserDefaults];
    BOOL boolPref = [aUseriCloud boolForKey:@"icloudEnabled"];

    if (boolPref && isIcloudAvailable)
    {
        isBothIcloudenabled = YES;
    }
    else {
        isBothIcloudenabled = NO;
    }

    return isBothIcloudenabled;

}

在我的UIVIewController上使用:

if ([utils isIcloudAvailable])
{...
}

URLForUbiquityContainerIdentifier:必须在主线程上调用nil,我该怎么做?我只知道dispatch_async但它不适用于返回函数。

由于

1 个答案:

答案 0 :(得分:2)

您的UIViewController应该在主线程上运行,因此不需要调度。如果您从另一个线程调用UIViewController方法,我建议您在主线程上使用dispatch_async运行该方法的调用,而不是在方法本身中执行。也就是说,UIViewController中的所有方法调用都在主线程上完成。

尽管如此,块可以设置超出其范围的值:

bool isCloudAvailable = NO;
dispatch_sync(dispatch_get_main_queue(), ^{
    isCloudAvailable = [utils isIcloudAvailable];
});

这将阻塞线程,直到主线程运行块为止。