0

我创建了多个 NSInvocationOperations 并将其添加到 NSOperationQueue。其中两个 NSInvocationOperations 创建了同一个父类的许多对象(Country 和 City 是 Location 的子类)。除了我注意到一个模型的变化或另一个模型有点被破坏之外,它大部分都很顺利。

查看商店(使用 sqlite 程序),我看到创建了第一个城市(可能总共 200 个),然后创建了所有国家(再次可能是 200 个)。如果我删除该应用程序并再次运行它,我将看到第一个国家,然后是所有城市。

我点击了文档并注意到 Apple 建议在您的 NSOperation 的启动方法中设置您的每个线程 MOC。但是我没有使用 NSOperation,我使用的是 NSInvocationOperation。这实际上让我更加质疑,为什么他们建议一开始就创建你的 MOC。

这是我的 NSInvocationOperation 的选择器...

+ (void)load:(NSString *)file
{
    NSManagedObjectContext *managedObjectContext = [(OSSMAppDelegate *)[[UIApplication sharedApplication] delegate] adHocManagedObjectContext];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(mergeChanges:)
                                             name:NSManagedObjectContextDidSaveNotification
                                           object:managedObjectContext];

    SBJsonParser *jsonParser = [[SBJsonParser alloc] init];

    NSString *json = [[NSString alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:file ofType:@"json"]];

    NSArray *objects = [[jsonParser objectWithString:json] valueForKeyPath:@"objects"];

    for(NSDictionary *object in objects)
    {
        [self createObjectWithObject:object inManagedObjectContext:managedObjectContext];
    }

    NSError *error = nil;
    [managedObjectContext save:&error];

}

...来自应用委托...

- (NSManagedObjectContext *)adHocManagedObjectContext
{
    NSManagedObjectContext *adHocManagedObjectContext = nil;

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];

    if (coordinator != nil)
    {
        adHocManagedObjectContext = [[NSManagedObjectContext alloc] init];
        [adHocManagedObjectContext setPersistentStoreCoordinator:coordinator];
        [adHocManagedObjectContext setUndoManager:nil];
    }

    return adHocManagedObjectContext;
}

...然后在其他地方(注意:firstRun 调用 load:)...

NSInvocationOperation *countryInvocationOperation = [[NSInvocationOperation alloc] initWithTarget:[Country class] selector:@selector(firstRun) object:nil];
[operationQueue addOperation:countryInvocationOperation];

在被调用的选择器中创建 MOC 有什么问题吗?我认为它必须是因为 MOC 与它创建的线程相关联。我想任何关于我哪里出错的指示都是有帮助的。

4

1 回答 1

0

I'm not sure I understand your problem (Do you have missing countries or cities?, do you have incorrect order? give an example of 'clobbered').

As for your question:

Is there any problem with creating the MOC in the selector that's being invoked?

No, there is no problem. the documentation only say it must be created ON the thread you intend to use it (start and main are methods that will run on the operation thread). hence, NSInvocationOperation will run your method in the operation thread, and you can create your MOC there without worries.

于 2013-04-18T17:34:40.340 回答