神奇记录IOS目标C.我们应该创建什么样的背景?

时间:2016-08-01 03:29:12

标签: ios objective-c magicalrecord

您好我正在使用Core Data IOS使用神奇的记录库来实现目标C.该库有许多NSManageObjectContext启动。我们应该使用什么来保持应用性能和良好的用户体验?

有很多

+ [NSManagedObjectContext MR_newContext]: Sets the default context as it's parent context. Has a concurrency type of NSPrivateQueueConcurrencyType.
+ [NSManagedObjectContext MR_newMainQueueContext]: Has a concurrency type of NSMainQueueConcurrencyType.
+ [NSManagedObjectContext MR_newPrivateQueueContext]: Has a concurrency type of NSPrivateQueueConcurrencyType.
+ [NSManagedObjectContext MR_newContextWithParent:…]: Allows you to specify the parent context that will be set. Has a concurrency type of NSPrivateQueueConcurrencyType.
+ [NSManagedObjectContext MR_newContextWithStoreCoordinator:…]: Allows you to specify the persistent store coordinator for the new context. Has a concurrency type of NSPrivateQueueConcurrencyType.

什么情境启动是好的?

例如,此函数处理JSON响应并在成功接收到共鸣时将记录保存到数据库

NSManagedObjectContext *localContext = [NSManagedObjectContext MR_context];


        [Stamp MR_truncateAllInContext:localContext];

                [responseJSON[@"root"] enumerateObjectsUsingBlock:^(id attributes, NSUInteger idx, BOOL *stop) {
                    Stamp *stamp = [Stamp MR_createEntityInContext:localContext];
                    [stamp setOrderingValue:idx];
                [stamp updateWithApiRepresentation:attributes];
        }];

        [localContext MR_saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) {
            if (completionBlock) {
                dispatch_async(dispatch_get_main_queue(), ^{
                    completionBlock(!error, error);
                });
            }
        }];

此功能执行获取请求

+ (NSArray *)yearsDropDownValues
{
    NSManagedObjectContext *moc = [NSManagedObjectContext MR_rootSavingContext];

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [Stamp entityInManagedObjectContext:moc];
    request.entity = entity;
    request.propertiesToFetch = @[StampAttributes.year];
    request.returnsDistinctResults = YES;
    request.resultType = NSDictionaryResultType;
    request.sortDescriptors = @[[[NSSortDescriptor alloc] initWithKey:StampAttributes.year ascending:NO]];

    NSArray *years = [moc executeFetchRequest:request error:nil];

    NSMutableArray *res = [NSMutableArray array];
    for (NSDictionary *year in years) {
        [res addObject:@{@"code": [NSString stringWithFormat:@"%@ Collections", year[@"year"]], @"value": year[@"year"] }];
    }

    return res;
}

任何帮助都非常感谢。感谢

1 个答案:

答案 0 :(得分:2)

在开始之前,我认为还有两个你应该了解和理解的上下文,当你使用MagicalRecord的默认方式来设置你的CoreData堆栈时,它们会自动创建:

  1. MR_rootSavingContext,它是一个直接连接到协调器的私有队列上下文,通常它将是您的根上下文。
  2. MR_defaultContext,它是一个主队列上下文,其父项为MR_rootSavingContext,通常它将是您的UI上下文,用它来获取并在屏幕上显示您的数据。
  3. 现在我将逐一解释这五个背景:

    1. MR_newContext,一个新的私有队列上下文,其中MR_defaultContext为其父上下文。它相当于调用[NSManagedObjectContext MR_newContextWithParent:[NSManagedObjectContext ME_defaultContext]]。这种类型的上下文适用于繁重的批处理操作,例如插入,更新,删除100个对象。由于所有操作都在后台线程上运行,因此不会阻止UI。然而,缺点是,它带来了额外的复杂性,特别是当你有多个这样的上下文时,保存这些上下文时可能会发生冲突。
    2. MR_newMainQueueContext,一个没有父上下文的新主队列上下文。它是MR_rootSavingContext的兄弟,因为它们连接到同一个NSPersistentStoreCoordinator。您在此类上下文中执行的所有操作都将阻止UI,因此请勿对此上下文执行任何繁重的工作。
    3. MR_newPrivateQueueContext,类似于MR_newContext,但它没有父上下文。它是MR_rootSavingContext
    4. 的兄弟姐妹
    5. MR_newContextWithParent,一种创建私有队列上下文以及指定父上下文的便捷方式。
    6. MR_newContextWithStoreCoordinator,一个使用指定NSPersistentStoreCoordinator的新私有队列上下文。从我的角度来看,只有当你知道如何正确使用不同协调器的上下文时,才不要使用它。
    7. 总而言之,在这些背景中没有好的或坏的,你需要根据你的要求选择合适的。