Khi sử dụng các loại NSPrivateQueueConcurrencyType
và NSMainQueueConcurrencyType
cho NSManagedObjectContext
, có an toàn khi thực hiện các cuộc gọi lồng nhau thực hiện lồng nhau trên cùng một ngữ cảnh không?Nested performBlock: trên NSManagedObjectContext
[backgroundContext performBlock:^{
NSFetchRequest *myRequest = ...;
__block NSArray *result= nil;
[backgroundContext performBlockAndWait:^{
results = [backgroundContext executeFetchRequest:myRequest error:NULL];
}];
}];
Dường như có vẻ ngu ngốc nhưng tôi có một cơ sở mã hiện có với nhiều phương pháp trợ giúp đóng gói các cuộc gọi executeFetchRequest
. Tôi không muốn đưa ra giả định về việc người gọi đã sử dụng performBlock hay chưa. Ví dụ:
-(void)updateObjects:(BOOL)synchronous
{
if (YES == synchronous)
[self fetchHelper];
else
{
[backgroundContext performBlock:^{
[self fetchHelper];
}];
}
}
-(NSArray*)fetchHelper
{
[self.backgroundContext performBlockAndWait:^{
//Fetch the objects...
[self.backgroundContext executeFetchRequest: (...)];
}];
}
Tôi đã thử nó và nó hoạt động. Nhưng tôi đã học được (một cách khó khăn) phải rất cẩn thận với Core Data và đa luồng.
Còn performBlock thì có phải là reentrant không? – malhal
Nó không phải là, điều này được bao gồm trong phiên. Yêu cầu của bạn sẽ xếp hàng nếu bạn gọi performBlock vì nó không đồng bộ. –
chỉ để được rõ ràng, những gì OP đang làm trong bit thứ hai của mã là ok để làm gì ?, Nhưng nó có thể gây ra vấn đề nếu cả hai phương pháp đã "performBlock"? đó là cách chính xác để xem xét điều này? – hokkuk