3

我设置了一些 NSLogs 以确保我的应用程序与 iCloud 同步更改,但我已经等了半个小时并且更改没有被同步。这是我的核心数据代码。核心数据存储存储在文档目录中,因为我希望它在失去对 iCloud 的访问权限时继续工作,并且不希望它在该实例中丢失数据库。

核心数据正常设置并更改数据,但似乎与 iCloud 不同步。

- (void)mergeChangesFromiCloud:(NSNotification *)notification {
    NSLog(@"changes from iCloud");
    NSManagedObjectContext* moc = [self managedObjectContext];

    [moc performBlock:^{

        [moc mergeChangesFromContextDidSaveNotification:notification];

        NSNotification* refreshNotification = [NSNotification notificationWithName:@"SomethingChanged"
                                                                            object:self
                                                                          userInfo:[notification userInfo]];

        [[NSNotificationCenter defaultCenter] postNotification:refreshNotification];
    }];
}

#pragma mark - Core Data Objects

- (NSManagedObjectContext *)managedObjectContext
{
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {

        _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];

        [_managedObjectContext performBlockAndWait:^{
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
        [[NSNotificationCenter defaultCenter]addObserver:self
                                                selector:@selector(mergeChangesFromiCloud:)
                                                    name:NSPersistentStoreDidImportUbiquitousContentChangesNotification
                                                  object:coordinator];
        }];

    }
    return _managedObjectContext;
}

- (NSManagedObjectModel *)managedObjectModel {

    if (_managedObjectModel != nil) {
        return _managedObjectModel;
    }

    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:DATABASE_MODEL_URL];

    return _managedObjectModel;
}

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

    NSURL *storeURL = [NSURL fileURLWithPath:STORE_PATH];

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

    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 database directory %@", fileSystemError);
            }

        NSString *iCloudEnabledAppID = @"ID REMOVED FROM STACK OVERFLOW";

        [options setObject:iCloudEnabledAppID            forKey:NSPersistentStoreUbiquitousContentNameKey];
        [options setObject:iCloudLogsPath                forKey:NSPersistentStoreUbiquitousContentURLKey];

        [_persistentStoreCoordinator lock];

        [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                          configuration:nil
                                    URL:storeURL
                                options:options
                                  error:nil];

        [_persistentStoreCoordinator unlock];

        }

        else {

            [_persistentStoreCoordinator lock];

            [_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                              configuration:nil
                                        URL:storeURL
                                    options:options
                                      error:nil];

            [_persistentStoreCoordinator unlock];
        }

    }

    [[NSNotificationCenter defaultCenter] postNotificationName:@"SomethingChanged" object:self userInfo:nil];


    return _persistentStoreCoordinator;
}

编辑:问题是 addPersistantStore 代码在括号中的位置错误。它应该是一个较低的支架。

4

0 回答 0