【发布时间】:2014-11-03 12:43:44
【问题描述】:
我正在使用 MagicalRecord。保存一些 ManagedObject(例如“Company”)后,我会立即发送通知以重新加载 Company 的 TableView 并创建其他对象(例如“People”)。
每个方法“addPeople”执行[Company findAllWithPredicate:...@"(lastUpdateDate == nil)"]并生成arrayOfCompany。
然后我用enumerateObjectsWithOptions:NSEnumerateConcurrent 迭代arrayOfCompany。
长时间的每次迭代。
作为结果,在下一次拦截通知和调用“addPerson”期间返回公司的相同对象。在每个创建的线程中,我都在使用相同的对象。
在 fetchRequest 期间如何锁定 Company 对象?
代码示例:
先打电话:
+ (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 = ...
...
});
}];
});
}
还有我的第二个问题:
什么是正确的:
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext)
{
[someArray enumerateObjectsWithOptions:usingBlock
{
}
}];
或
[someArray enumerateObjectsWithOptions:usingBlock
{
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext)
}
];
【问题讨论】:
标签: objective-c multithreading macos core-data magicalrecord