iCloud在模拟器上连接但在设备上没有连接

时间:2014-03-24 20:57:26

标签: ios ios-simulator icloud


我是iOS编程的新手,现在我遇到的问题是,如果我在真实设备上运行我的应用程序,我无法获得iCloud连接。
该应用程序在模拟器上运行完美,并且如果我将设备从我的mac断开连接 有谁知道如何解决它? 这是我为连接iCloud而编写的代码

    self.fileManager = [NSFileManager defaultManager];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        self.ubiquityIdentifier = [self.fileManager URLForUbiquityContainerIdentifier:nil];
    });

    dispatch_async(dispatch_get_main_queue(), ^{
        if(self.ubiquityIdentifier)
        {
            [[NSNotificationCenter defaultCenter] postNotificationName:kiCloudAvailableNotification object:self.ubiquityIdentifier];
            [self startMediaQuery];
        }
        else
        {
            [[NSNotificationCenter defaultCenter] postNotificationName:kiCloudNotAvailableNotification object:self.ubiquityIdentifier];
            NSLog(@"iCloud not available");
        }
    });

如果设备已连接,我只进入else块,如果我在模拟器或未连接的设备上进行测试,一切正常。
非常感谢。
weissja19

1 个答案:

答案 0 :(得分:1)

假设您正在检测失败,因为NSLog打印了它的" iCloud不可用"消息,你在这里建立一个经典的竞争条件:

  1. 设置全局(非主要)队列中self.ubiquityIdentifier的值。
  2. 测试主队列上的值self.ubiquityIdentifier
  3. 两个dispatch_async调用在不同的队列上运行。因此,您无法保证在测试之前设置self.ubiquityIdentifier的值。它有时会起作用,而对其他人起作用,并不一定是出于任何明显的原因。当你得到" iCloud不可用时#34;消息,因为第二个队列在您分配任何值之前检查了该值。

    修复方法是更改​​调度调用,以便保证执行顺序。两种可能性是:

    1. 合并这两个dispatch_async调用,以便所有代码都在同一个队列中发生,或者
    2. 将第二个dispatch_async 移到第一个中,这样您就不会发送回主队列,直到您为{{1}设置了值}。