【发布时间】:2015-09-05 18:26:12
【问题描述】:
在 Mac OS X 应用程序 (Cocoa) 中,我使用 NSDraggingSession 将一些图像从我的应用程序复制到其他应用程序。 NSDraggingItem 使用实现协议NSPasteboardItemDataProvider 的对象,在用户丢弃它时提供数据。
当我处理图像时,涉及的类型有:NSPasteboardTypePNG、kPasteboardTypeFileURLPromise、kUTTypeFileURL、com.adobe.photoshop-image 和 public.svg-image。这些图像位于远程位置,因此在将它们提供给粘贴板之前,我必须从 Internet 下载它们。
我实现了方法- pasteboard(pasteboard:item:provideDataForType:) 做这样的事情:
-
如果请求的类型是
kPasteboardTypeFileURLPromise,我会获取粘贴位置,并在粘贴板中构建和设置 URL 字符串以及将来应该写入文件的位置。 如果请求的类型是
kUTTypeFileURL,我下载文件,指定一个临时位置并将下载的文件写入该位置。然后,我在粘贴板中设置了该位置的 URL 字符串。如果请求的类型是其他类型之一,我下载文件并在粘贴板中设置纯
NSData。
所有这些操作都在主线程上执行,产生了一些我想摆脱的滞后。
我尝试在后台线程上执行这些操作,然后返回主线程在粘贴板中设置最终数据,但这不起作用,因为该方法之前完成。
有人知道实现它的方法吗?
【问题讨论】:
-
据我发现,仅 NSPasteboard API 无法返回您打算写入文件的 URL,但允许您写入它是异步的。我与一位 Apple 工程师交谈过,他建议在编写文件时使用 NSFileCoordinator,但并非所有目标应用程序都会尊重这一点。
-
问题是我需要先下载并写入文件,然后再告诉粘贴板将在哪里,因为如果我异步执行此操作,目标应用程序会在它被写入并找到之前执行它没有。同步解决方案尊重执行顺序就好了,但是阻塞了主线程。
-
是的,这是有道理的。祝你好运;这个 API 既旧又笨重。你可能在cocoa-dev 名单上也有一些运气。
标签: macos cocoa nspasteboard nsdraggingitem