首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在何处为NSInvocationOperation创建NSManagedObjectContext

在何处为NSInvocationOperation创建NSManagedObjectContext
EN

Stack Overflow用户
提问于 2013-04-18 02:35:09
回答 1查看 106关注 0票数 0

我创建了多个NSInvocationOperations并将其添加到NSOperationQueue中。其中两个NSInvocationOperations创建了相同父类(Country和City的子类Location)的许多对象。它基本上进行得很顺利,除了我注意到一个模型或另一个模型的更改有点受挫。

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

我查看了文档,注意到苹果建议在you NSOperation的start方法中设置每个线程的MOC。但是,我使用的不是NSOperation,而是NSInvocationOperation。这实际上让我产生了更多的疑问,所以为什么他们建议在start中创建你的MOC。

这是我的NSInvocationOperation选择器...

代码语言:javascript
复制
+ (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];

}

...from应用程序委派...

代码语言:javascript
复制
- (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调用...then:)...

代码语言:javascript
复制
NSInvocationOperation *countryInvocationOperation = [[NSInvocationOperation alloc] initWithTarget:[Country class] selector:@selector(firstRun) object:nil];
[operationQueue addOperation:countryInvocationOperation];

在被调用的选择器中创建MOC有什么问题吗?我想这是必须的,因为MOC与创建它的线程绑定在一起。我想任何关于我哪里出错的建议都是有帮助的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-19 01:34:40

我不确定我是否理解您的问题(您是否缺少国家或城市?您是否有错误的订单?举一个‘clobbered’的例子)。

至于你的问题:

在被调用的选择器中创建

有什么问题吗?

不,没有问题。文档只说它必须在您打算使用它的线程上创建(startmain是将在操作线程上运行的方法)。因此,NSInvocationOperation将在操作线程中运行您的方法,您可以在那里创建您的MOC而无需担心。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16067552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档