无法从另一个线程中删除Realm数据库对象(即使在搜索之后)

时间:2015-04-02 22:58:18

标签: ios realm

我遇到与此主题中的海报类似的问题: Unable to delete an object in a realm database

我有一个RLMObject子类数组,这些子类是通过搜索名为' syncQueue'的队列创建的。它是一堆需要发送到服务器的诊断对象。

这些对象被打包并使用Google Client Library for iOS发送到服务器。一旦库返回对象已成功上载,我想从Realm中删除它们。我从Realm获取了一些样本。

NSArray *samples = [someClass getMySamplesFromRealm];

所以现在我有一系列样本。 ^^这发生在" syncQueue'上,它使用自己的线程。仍然在同一个线程上,我们打包并上传样本。所以有一个回调块看起来像这样:

GTLServiceTicket *ticket = [service executeQuery:query completionHandler:^(GTLServiceTicket *ticket, id object, NSError *error)
    {
        [syncHandler removeTicket:ticket];
        if( error )
        {
            // Handle Error
        }
        else
        {
            [diagDataAccessManager deleteObjects:samples];
        }
    }];

以下是删除这些对象的代码。

1  - (void)deleteObjects:(NSArray *)samples
2  {
3      if (samples.count > 0) 
4      {
5          [[RLMRealm defaultRealm] beginWriteTransaction];
6          for (Diagnostic *diagnostic in samples) 
7          {
8              Diagnostic *diagnosticToDelete = [Diagnostic objectForPrimaryKey:diagnostic.primaryId];
9              [[RLMRealm defaultRealm] deleteObject:diagnosticToDelete];
10         }
11         [[RLMRealm defaultRealm] commitWriteTransaction];
12     }
13     
14 }

所以我在删除之前尝试进行搜索。然而...

在第8行,我得到一个例外:" Realm从错误的线程访问" 现在,我认为这是因为当我运行Diagnostic objectForPrimaryKey:时,它&#39 ; s尝试使用与在另一个线程上创建的*diagnostic对象关联的领域。

我的问题是:如果我不能查看它们以找出它们所属的具体对象,我可以在地球上删除这些特定对象吗?

非常感谢任何澄清/建议。

1 个答案:

答案 0 :(得分:4)

最好的方法可能是将主键传递给新线程,而不是对象。