0

这次简单的问题,我在我的新应用程序中创建了一个“实用程序”类,它可以帮助我在不同的 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 但它不适用于返回函数。

谢谢

4

1 回答 1

2

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

尽管如此,块可以在其范围之外设置值:

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

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

于 2013-09-03T18:23:24.887 回答