我正在CoreData
使用MagicalRecord
而NSManagedObjectContext's
存在问题,尽管几乎没有使用不同的线程来访问实体,即有一个实体{{1以及创建/更新和使用此实体的场景如下:
User
[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
}]
使用授权User
时
在这个方法中,我使用REST API获取数据。我的请求是在后台线程上执行的
响应正在主线上。[self authorizeWithCode:%code%];
[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
必须有一个且只有一个实体。 我做错了什么?每当我尝试更新现有数据时,获取更新实体并且不创建新实体的正确方法是什么?
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
}