gpt4 book ai didi

cocoa - NSPasteboard 线程安全吗?

转载 作者:行者123 更新时间:2023-12-03 16:26:18 26 4
gpt4 key购买 nike

从后台线程将数据写入 NSPasteboard 对象是否安全?我似乎无法在任何地方找到明确的答案。我认为假设是在拖动开始之前数据将被写入粘贴板。

背景:
我有一个从 Evernote 获取数据的应用程序。当应用程序首次加载时,它会获取每个笔记的元数据,但不会获取笔记内容。然后,笔记 stub 会在大纲 View 中列出。当用户开始拖动笔记时,笔记会传递到后台线程,该线程负责从 Evernote 获取笔记内容。在获取数据之前让主线程阻塞会导致显着的延迟和糟糕的用户体验,因此我有 [outlineView:writeItems:toPasteboard:] 函数返回 YES后台线程处理数据并调用主线程将数据写入粘贴板对象。如果在用户将笔记放在某处之前笔记内容已传输,则一切都会正常进行。如果用户在处理数据之前将注释放在某处……好吧,一切都会永远阻塞。让后台线程将数据写入粘贴板是否安全?

最佳答案

您可以在尚未实际拥有数据的情况下向粘贴板 promise 数据。

一种方法是声明粘贴板上数据的类型,将您自己传递为粘贴板的所有者,并响应 a pasteboard:provideDataForType: message通过提供数据(如有必要,阻塞,直到数据到达或未能到达)。这意味着您需要记住复制了哪些对象(例如,将它们存储在数组中),以便在 promise 到期时可以从中提取/生成数据。

Harald Scheirich 的答案中引用的另一种方法是使模型对象符合 the NSPasteboardWriting protocol ,最好在一个类别中(将独立于接口(interface)的逻辑与特定于 Mac 的逻辑分开)。这比旧方法干净得多,但需要 Mac OS X 10.6 及更高版本。

使用 NSPasteboardWriting,您将通过模型对象' writingOptionsForType:pasteboard: method 来实现 promise 。返回the NSPasteboardWritingPromised option 。他们的 pasteboardPropertyListForType: method将返回数据,或者至少尝试返回数据 - 和以前一样,此方法应该阻塞,直到数据到达或无法到达。

哦,回答标题中的问题(“NSPasteboard 线程安全吗?”):Thread Safety Summary 中没有具体答案。 ,但有这样的一般性声明:

… mutable objects are generally not thread-safe. To use mutable objects in a threaded application, the application must synchronize appropriately.

我认为 NSPasteboard 是一个可变对象,所以不是。

实际上,这不是问题:您通常只使用 NSPasteboard 来响应操作消息(例如,copy:)、拖动或服务调用,以及所有这些无论如何只发生在主线程上。为了让它们发生在辅助线程上,您必须自己从辅助线程上运行的代码中显式发送此类消息,在这种情况下,您已经做了一些非常错误的事情。

关于cocoa - NSPasteboard 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2795798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com