如何将saveWithBlock中的实体传递给完成块

时间:2015-09-23 09:29:09

标签: ios iphone magicalrecord

我知道MagicalRecord将在后端线程上执行saveWithBlock并在主线程上执行completion,但只是对如何将saveWithBlock中的实体传递给完成块感到困惑,具体来说:

Event *wantToCreateEvent = nil;
Event *wantToUpdateEvent = toBeUpdatedEvent;

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext){
    wantToCreateEvent = [Event MR_createEntityInContext:localContext];

    Event *localContextEvent = [wantToUpdateEvent MR_inContext:localContext];
    localContextEvent.attri = @"newValue"
} completion:^(BOOL success, NSError *error) {

    // Can I use wantToCreateEvent directly here?

    // Is wantToUpdateEvent updated here?
}

2 个答案:

答案 0 :(得分:0)

如果需要在块中修改变量,请在变量上使用__block存储类型修饰符。

__block Event *wantToCreateEvent = nil;
__block Event *wantToUpdateEvent = toBeUpdatedEvent;

根据Apple发现的文件here

  

使用__block变量共享存储空间

     

如果您需要能够在块中更改捕获变量的值,则可以在原始变量声明上使用__block存储类型修饰符。这意味着变量存在于原始变量的词法范围与该范围内声明的任何块之间共享的存储中。

答案 1 :(得分:0)

对于实体创建,您可以使用Megical Record

的2个功能
+ (id) MR_createEntityInContext:(NSManagedObjectContext *)context;
+ (id) MR_createEntity;

注意:对于保存实体您只需要保存创建这些实体的上下文

在后台保存

+ (void) saveWithBlock:(void(^)(NSManagedObjectContext *localContext))block;
+ (void) saveWithBlock:(void(^)(NSManagedObjectContext *localContext))block completion:(MRSaveCompletionHandler)completion;

保存在主线程中

+ (void) saveWithBlockAndWait:(void(^)(NSManagedObjectContext *localContext))block;

有关CoreData的更多了解使用MegicalRecord,我建议您阅读本教程

Understanding CoreData With Magical Record