我正在使用MagicalRecord。保存一些ManagedObject(例如「公司」)後,我立即發送通知以重新加載公司的TableView並創建其他對象(例如「People」)。核心數據MagicalRecord:獲取請求並保存爲多線程。鎖定獲取的對象?
每種方法 「addPeople」 執行[Company findAllWithPredicate:[email protected]"(lastUpdateDate == nil)"]
和產生arrayOfCompany
。
然後我重複arrayOfCompany
與enumerateObjectsWithOptions:NSEnumerateConcurrent
。 長時間的每次迭代。
正如在接下來的截距通知的結果,並調用「addPerson的」返回公司的相同的對象。並且在每個創建的線程中,我都使用相同的對象。
如何鎖定公司fetchRequest期間對象?
代碼示例:
先打電話:
+ (void)addCompany
{
...
[arrayOfCompanies enumerateObjectsWithOptions:NSEnumerateConcurrent
usingBlock:^(Company *obj, NSUInteger idx, BOOL *stop)
{
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext){
Company *company = [Company createEntityInContext:localContext];
....
}
completion:^(BOOL contextDidSave, NSError *error){
if (contextDidSave)
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"newCompanyJustAdded"
object:nil];
}
}];
}];
}
通知捕獲:
+ (void)newCompanyJustAdded:(NSNotification *)notification
{
[Person addPersons];
}
+ (void)addPersons
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
predicate = @"(lastUpdateDate == nil)";
NSArray *companysInCoreData = [Company findAllWithPredicate:predicate];
[companysInCoreData enumerateObjectsWithOptions:NSEnumerateConcurrent
usingBlock:^(id obj, NSUInteger idx, BOOL *stop)
{
NSManagedObjectContext *local_context = [NSManagedObjectContext contextForCurrentThread];
Company *local_company_obj = [obj inContext:local_context];
...
local_company_obj.lastUpdateDate = [NSDate date];
[local_context saveToPersistentStoreAndWait];
...
...
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext)
{
Person *person = [Person createEntity];
person.name = ...
...
});
}];
});
}
而我秒OND問題:
什麼是正確的:
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext)
{
[someArray enumerateObjectsWithOptions:usingBlock
{
}
}];
或
[someArray enumerateObjectsWithOptions:usingBlock
{
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext)
}
];