【问题标题】:How to pass entity in saveWithBlock to completion block如何将 saveWithBlock 中的实体传递给完成块
【发布时间】:2015-09-23 09:29:08
【问题描述】:

我知道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?
}

【问题讨论】:

    标签: ios iphone magicalrecord


    【解决方案1】:

    对于实体创建,您可以使用 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

    【讨论】:

      【解决方案2】:

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

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

      根据苹果的文档发现here

      使用 __block 变量共享存储

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

      【讨论】:

        猜你喜欢
        • 2016-06-05
        • 1970-01-01
        • 1970-01-01
        • 2019-04-08
        • 2015-07-25
        • 2021-10-03
        • 2020-12-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多