【问题标题】:IOS/Objective-C: Edit managed object after it is inserted into core dataIOS/Objective-C:将托管对象插入核心数据后对其进行编辑
【发布时间】:2015-11-04 12:02:39
【问题描述】:

在代表新项目的核心数据中插入一个新对象,然后在后台线程上执行服务器调用以将其插入后端的数据库后,我从服务器检索一个我想要的新 id插入回核心数据。

任何人都可以推荐一个保存新项目并调用服务器而不会丢失 ManagedObjectContext 中的新项目。我想对托管对象进行编辑,而不必使用 NSPredicate 执行整个 NSFetch 来再次找到它,但现在它似乎正在消失。

这是我将对象本地存储在 Core Data 中然后转到服务器的代码。然而,当我回来时,我不知道如何访问这条新记录。

 NSEntityDescription *entity = [NSEntityDescription entityForName:@“Item” inManagedObjectContext:self.managedObjectContext];

        // Initialize Record
        NSManagedObject *record = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext];

        // Populate Record
        [record setValue:name forKey:@“name”];
         // Save Record
        NSError *error = nil;

        if ([self.managedObjectContext save:&error]) {
          //code to set up background request
   [NSURLConnection sendAsynchronousRequest:rq queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *rsp, NSData *data, NSError *err) {
        if (err) {
        } else {
            NSDictionary *jsonResults = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
             NSInteger insertID = [jsonResults[@"response"][@"insert_id"] integerValue];
            self.newid = *(&(insertID));
            dispatch_async(dispatch_get_main_queue(), ^{
              //          //NEED WAY TO INSERT INTO CORE DATA WITHOUT DOING FULL BLOWN FETCH BUT RECORD SEEMS TO BE GONE
            });
        }
    }];
} 

【问题讨论】:

  • 请您澄清一下“记录似乎消失了”?该指针现在是nil,还是托管对象nil 的所有属性或为零,还是其他?
  • 保存后,它仍然存在,即我可以登录到控制台record.somproperty。但是,一旦我进入同步线程,如果我将 record.something 放在代码中,它会给出一个红色错误消息 Use of undeclared identifier: record

标签: ios objective-c core-data


【解决方案1】:

2 个选项,有点懒惰和“正确”

假设这一切都起源于主线程,所以record被插入到主上下文中,你可以在块中捕获record并更新它。不要在任何其他线程上对其进行任何其他更改。另外,在此操作完成之前不要删除它或上下文。

更好的是,从新的record 中获取objectID,确保它是永久 id 而不是临时的(请参阅obtainPermanentIDsForObjects:error:)。现在,对于您正在处理的任何线程,您都可以从适当的上下文中请求,如果需要,执行一个块,objectRegisteredForID:

【讨论】:

  • 如何从新记录中获取objectID?它只是 record.NSManagedObjectID 还是其他?
  • objectID 是方法名
  • 一旦我有了 objecID,类似 NSManagedObject *object = objectRegisteredForID.objectid; object.servid = insertID;?
  • 正在使用未声明的标识符:objectRegisteredForID
  • 一旦我在 managedObjectContext 上调用方法就让它工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多