MagicalRecord NSManagedObject不能正确保存

时间:2015-12-04 07:44:32

标签: ios objective-c core-data nsmanagedobjectcontext magicalrecord

我正在CoreData使用MagicalRecordNSManagedObjectContext's存在问题,尽管几乎没有使用不同的线程来访问实体,即有一个实体{{1以及创建/更新和使用此实体的场景如下:

  1. 当应用开始时,请致电User
  2. 如果创建了[Database getCurrentUser:(User *user){ .... // Here comes some logic to choose rootViewController depends on data inside entity // if there is no any entities of User, this method creates a new one }]使用授权
  3. 打开VC的新实体
  4. 当用户输入他的数据并按下按钮授权通话方法User时    在这个方法中,我使用REST API获取数据。我的请求是在后台线程上执行的    响应正在主线上。
  5. 从网络获取数据后,请致电[self authorizeWithCode:%code%];
  6. 正如您所见,方法[Database updateUserData:%data% completion:(BOOL success){ // See implementation below // if success == YES call [self getCitiesList]; }];调用方法[self getCitiesList]正在运行,例如[Api getCitiesList:^(BOOL success, NSDictionary *responseObject, NSError *error){}];(我的意思是线程)但是要使用此方法获取数据,我必须在请求正文中放置两个参数。为了实现这一目标,我试图获取已保存在[self authorizeWithCode:%code%];中的实体,但每次执行此操作时,虽然[Database updateUserData:%data% completion:(BOOL success){}];打印成功的保存消息,但我将获得空实体。 我试图打印NSLog的所有实体并感到惊讶。有8个不同的实体!主要思想是User必须有一个且只有一个实体。
  7. 我做错了什么?每当我尝试更新现有数据时,获取更新实体并且不创建新实体的正确方法是什么?

    Database.m方法:

    User

    Api.m +(void)getCurrentUser:(void (^)(User *))user{ __block User *currentUser = [User MR_findFirstInContext:[NSManagedObjectContext MR_defaultContext]]; if(!currentUser){ [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) { User *newUser = [User MR_createEntityInContext:localContext]; currentUser = newUser; } completion:^(BOOL contextDidSave, NSError *error) { user(currentUser); }]; } else { user(currentUser); } } +(void)updateUserData:(NSDictionary *)data completion:(void (^)(BOOL success))completion{ User *user = [User MR_findFirstInContext:[NSManagedObjectContext MR_defaultContext]]; [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) { User *currentUser = [user MR_inContext:localContext]; currentUser = [User MR_importFromObject:data inContext:localContext]; } completion:^(BOOL contextDidSave, NSError *error) { completion(contextDidSave); }]; } 方法:

    getCitiesList

    AuthVC.m方法:

    +(void)getCitiesList:(Completion)completion{
            User *currentUser = [User MR_findFirstInContext:[NSManagedObjectContext MR_context]];
            DEFAULT_BACKGROUND_THREAD_BLOCK
            [NetworkManager GET:FormatString(@"%@%@",BASE_URL,GET_CITIES_URL) params:@{kPhoneKey:currentUser.phone,kTokenKey:currentUser.access_token} completion:^(BOOL success, NSDictionary *responseObject, NSError *error) {
            if(success && responseObject){
                ...
            }
            MAIN_THREAD_BLOCK
            completion(success,responseObject,error);
            END_THREAD_BLOCK
            }];
            END_THREAD_BLOCK
    }
    

0 个答案:

没有答案