App使用iCloud在addPersistentStoreWithType上停顿

时间:2013-01-23 13:11:39

标签: iphone ios objective-c core-data icloud

我的persistentStoreCoordinator中有以下代码。没有iCloud部分,它可以正常工作。使用iCloud,它会在addPersistentStoreWithType方法上停止。没有错误,它只是停在它上面并且不会继续。

有什么想法吗?

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (_persistentStoreCoordinator != nil) {
        return _persistentStoreCoordinator;
    }

    NSURL *storeURL = [NSURL fileURLWithPath:STORE_PATH];

    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];


    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    NSMutableDictionary *options = [NSMutableDictionary dictionary];
    [options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
    [options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];


        NSFileManager *fileManager = [NSFileManager defaultManager];

        NSURL *iCloud = [fileManager URLForUbiquityContainerIdentifier:nil];
        NSLog(@"icloud: %@", iCloud);

        if (iCloud) {

            NSString *iCloudLogsDirectoryName = @"Logs";
            NSURL *iCloudLogsPath = [NSURL fileURLWithPath:[[iCloud path] stringByAppendingPathComponent:iCloudLogsDirectoryName]];

            //Create logs directory, in case it doesn't exist
            if([fileManager fileExistsAtPath:[iCloudLogsPath path]] == NO) {
                NSLog(@"logs directory doesn't exist");
                NSError *fileSystemError;
                [fileManager createDirectoryAtPath:[[iCloud path] stringByAppendingPathComponent:iCloudLogsDirectoryName]
                       withIntermediateDirectories:YES
                                        attributes:nil
                                             error:&fileSystemError];
                if(fileSystemError != nil) {
                    NSLog(@"Error creating logs directory %@", fileSystemError);
                }
            }

            NSString *iCloudEnabledAppID = @"app id removed from stackoverflow";

            [options setObject:iCloudEnabledAppID            forKey:NSPersistentStoreUbiquitousContentNameKey];
            [options setObject:iCloudLogsPath                forKey:NSPersistentStoreUbiquitousContentURLKey];
            NSLog(@"logs path: %@", iCloudLogsPath);
        }

    [_persistentStoreCoordinator lock];

    NSError *error;

    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                   configuration:nil
                                                             URL:storeURL
                                                         options:options
                                                           error:&error]) {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
    else {
        NSLog(@"done adding persistent store");
    }

    [_persistentStoreCoordinator unlock];

    dispatch_async(dispatch_get_main_queue(), ^{
        [[NSNotificationCenter defaultCenter] postNotificationName:@"SomethingChanged" object:self userInfo:nil];
        [self.delegate contextWasSetupInManager:self];
    });

    });

    return _persistentStoreCoordinator;

}

3 个答案:

答案 0 :(得分:2)

这与iCloud很常见。 Apple建议您将其置于后台队列,因为该呼叫可能会阻止。它阻止,因为这是Core Data实际连接到iCloud服务器并开始下载任何可用的新数据的地方。呼叫在完成之前不会继续。如果要下载大量数据,您可能需要等待一段时间。

有时需要一段时间没有明显的理由。它像那样片状。

最终你所看到的几乎就是iCloud的现状。提交一两个bug,希望事情有所改善。

答案 1 :(得分:1)

我刚在我的一个测试设备(运行iOS 6.1的iPhone 5)上体验过这个。执行恢复出厂设置,然后从手机的当前备份进行恢复修复它。

我不确定这是解释,但是通过设备设置>删除应用程序的iCloud ubiquity容器数据似乎存在问题。 iCloud>存储&备份。这可能会使设备处于无处不在的容器残留并且无法移除的状态。在设备上进行完全擦除和恢复似乎可以解决它。

我发现一篇旧帖子看起来与此问题(http://stackmonthly.com/2011/11/core-data)有关,而且此条目与OpenRadar(http://openradar.appspot.com/10440734)相关。我乱了几个小时,直到我擦拭并恢复了设备,这完美地运行了:addPersistentStoreWithType几乎立即完成。

继续前进我将尝试使用WWDC 2012示例应用程序SharedCoreData(会话227)中的nukeAndPave方法清除商店,而不是从“设置”中手动删除商店。希望这可以防止这种情况再次发生。

答案 2 :(得分:0)

我不完全确定为什么会出现这些问题但是我通过重置手机的设置来解决这种问题已经取得了很大的成功:

设置>一般>重置>重置所有设置