【问题标题】:Attempting to modify object outside of a write transaction尝试在写事务之外修改对象
【发布时间】:2014-09-03 07:06:14
【问题描述】:

我正在尝试检索所有已保存的用户 (RLMObject) 对象。然后我检查是否有任何对象保存。如果不是,我创建一个新的用户对象并尝试保存它。

  RLMArray *allUsers = [User allObjects];

 if (allUsers.count == 0) {
      RLMRealm *realm = [RLMRealm defaultRealm];
      [realm beginWriteTransaction];

      User *newUser = [[User alloc]init];
      newUser.userID = [userDict[@"id"] integerValue];
      newUser.role = userDict[@"role"];
      newUser.email = userDict[@"email"];
      newUser.given_name = userDict[@"profile"][@"given_name"];
      newUser.family_name = userDict[@"profile"][@"family_name"];

      [realm addObject:newUser];
      [realm commitWriteTransaction];

  }

但是,这会因以下消息而崩溃:'RLMException', reason: 'Attempting to modify object outside of a write transaction - call beginWriteTransaction on a RLMRealm instance first.'

我真的不知道为什么。我正在修改默认领域的写入事务中的对象。

提前致谢!

【问题讨论】:

  • 你确定那是应用程序崩溃的地方吗?
  • @trojanfoe 你是对的,那不是它崩溃的地方。

标签: ios iphone realm


【解决方案1】:

您必须为每个线程调用一次 RLMRealm defaultRealm,以获取不同的 RLMRealm 实例(相同的文件路径,但不同的变量)。这使我们能够为您轻松整理所有线程安全。详情请见http://realm.io/docs/cocoa/0.84.0/#using-a-realm-across-threads

【讨论】:

    【解决方案2】:

    没关系,我的愚蠢错误。感谢@trojanfoe 的提醒。

    我正在后台线程上下载图像并在完成时将其存储在领域中。看起来像第二次调用 defaultRealm 返回一个不同的实例。

    【讨论】:

    • defaultRealm 将始终返回相同的路径,但每个调用它的线程都会返回不同的实例。蒂姆的回答是正确的。
    • @jpsim 对不起,这就是我想说的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    相关资源
    最近更新 更多