我是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
答案 0 :(得分:1)
假设您正在检测失败,因为NSLog
打印了它的" iCloud不可用"消息,你在这里建立一个经典的竞争条件:
self.ubiquityIdentifier
的值。self.ubiquityIdentifier
。两个dispatch_async
调用在不同的队列上运行。因此,您无法保证在测试之前设置self.ubiquityIdentifier
的值。它有时会起作用,而对其他人起作用,并不一定是出于任何明显的原因。当你得到" iCloud不可用时#34;消息,因为第二个队列在您分配任何值之前检查了该值。
修复方法是更改调度调用,以便保证执行顺序。两种可能性是:
dispatch_async
调用,以便所有代码都在同一个队列中发生,或者dispatch_async
移到第一个中,这样您就不会发送回主队列,直到您为{{1}设置了值}。