我正在尝试从我的数据库中获取请求。但我的回答是零。提取是可以的,因为当我使用这种方法时,我得到“有时”的值。 (我知道我在数据库中有数据)。我认为这与线程问题有关,或者因为我使用的是Multi-Context。所以我的问题基本上是通用的。
如果我在特定MOC中保存一些数据,我们称之为MOC1然后我想获取我刚才保存的数据..我可以使用任何MOC吗? (假设我保存了孩子和父母,我可以看到DB上的变化)
如果我使用MOC保存使用NSPrivateQueueConcurrencyType的数据,我可以使用MOC NSMainQueueConcurrencyType获取吗?和相反的方式..?
我可以在后台线程上获取数据,或者我必须在主线程上获取?
主线程和NSMainQueueConcurrencyType之间的连接是什么
后台线程和NSPrivateQueueConcurrencyType之间的连接是什么 谢谢,
更新
问题是我获取一些实体并将一些标志更改为isSync = YES当我想保存它时我使用我的保存方法:
-(void)saveDataToDBWithCompletionWithManagedObjectContext:(NSManagedObjectContext*)managedObjectContext withCompletion:(void (^)(BOOL succeeded ,NSError *error))completion {
if (managedObjectContext != nil) {
[managedObjectContext performBlockAndWait:^{
NSError *errorMsg = nil;
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&errorMsg]) {
// do some real error handling
NSLog(@"couldn't save Background Context, error %@, %@", errorMsg, [errorMsg userInfo]);
if (completion) {
completion(NO, errorMsg);
}
} else {
if (completion) {
completion(YES, nil);
}
}
}];
} else {
if (completion) {
completion(NO, nil);
}
}
}
此方法获取NSManagedObjectContext,并将其保存到相关的NSManagedObjectContext中。然后我运行我的主保存:
-(void)saveMasterDataToDBWithSync:(BOOL)toDoSync WithCompletion:(void (^)(BOOL succeeded ,NSError *error))completion {
NSError *errorMsg = nil;
if (self.masterManagedObjectContext != nil) {
if ([self.masterManagedObjectContext hasChanges] && ![self.masterManagedObjectContext save:&errorMsg]) {
if (completion) {
completion(NO, errorMsg);
}
} else {
if (toDoSync) {
// DO sync with Parse
}
if (completion) {
completion(YES, nil);
}
}
} else {
if (completion) {
completion(NO, nil);
}
}
}
当我检查我的数据库时,数据就在那里!但是当我试图去取它时我看不到任何东西。
答案 0 :(得分:1)
是。但是您需要找到一种方法来通知MOC您所做的更改。您可以使用子/父上下文(parentContext
),保存到persistentStoreCoordinator
或使用mergeChangesFromContextDidSaveNotification
合并更改来执行此操作。在任何情况下,您都必须save
才能传播更改。
是。与#1相同。
只要您使用与此MOC关联的线程/队列,就可以获取您希望的任何线程。您可以使用performBlock
或仅确保运行NSMainQueueConcurrencyType
并从主线程调用fetch来执行此操作。
NSMainQueueConcurrencyType
应仅在主线程上运行。
NSPrivateQueueConcurrencyType
有自己的私人队列。使用performBlock
在该队列上运行提取。