【问题标题】:How to copy values out of a Realm Object to pass to another thread如何从领域对象中复制值以传递给另一个线程
【发布时间】:2016-12-09 02:03:57
【问题描述】:

我有一个 Realm 对象(我们称之为文件),它带有一个名为 url 的字符串属性。 我创建了一个 Alamofire DownloadRequest.DownloadFileDestination 块,其中包含对 url 的引用,因此我可以下载该文件。然而,因为这个块是在后台线程上执行的,Realm 会抛出一个异常。我不需要实际访问整个 Realm,甚至整个 File 对象——只需要属性url——所以没有理由尝试在后台线程中从 Realm 打开 File 对象。

将这个字符串(或其他类型的属性)复制出 Realm 对象以传递给不同线程的正确方法是什么?

我目前的解决方案似乎很不优雅——尽管它确实有效。

let url = "\(object.url)"

这个问题与特定的代码块无关——它更像是一个概念性问题。

【问题讨论】:

  • 请更具体地说明您的类型。 url的类型是Swift的String吗?如果是这样,那是一个值类型,那么“引用”它是什么意思?

标签: ios swift multithreading realm


【解决方案1】:

这是正常的,如果你读到Realm's docs for threading,上面写着you cannot have multiple threads sharing the same instances of Realm objects,那意味着你在主线程上获取File对象,你不能在其他线程上使用它,你的情况是Alamofire后台线程

您所做的是正确的,将 url 的值分配给另一个变量,否则,只需调用 fetchFile().url 其中 fetchFiles() 从 Realm 返回文件对象(重新获取文件对象 - 但这会降低性能,仅有用在领域对象发生很大变化的其他情况下)

【讨论】:

  • 我知道这是 Realm 的预期行为。我的问题是如何在这些限制内工作。是否会简单地分配属性,例如 let url = object.url 将其与 Realm 取消链接并且它会实时更新对象?
  • 是的,正如我所说,如果您只是想使用它,这是正确的方法,或者如果您需要更改它,只需将获取函数传递给 alamofire 而不是传递领域对象,只需在其他线程上重新获取它来自多个线程
【解决方案2】:

简单地分配let url = object.url 将复制值并且是线程安全的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多