4

在 Mac OS X 应用程序 (Cocoa) 中,我使用NSDraggingSession. 使用NSDraggingItem实现协议的对象,NSPasteboardItemDataProvider在用户丢弃它时提供数据。

当我处理图像时,所涉及的类型是:NSPasteboardTypePNG、、、和。这些图像位于远程位置,因此在将它们提供给粘贴板之前,我必须从 Internet 下载它们。kPasteboardTypeFileURLPromisekUTTypeFileURLcom.adobe.photoshop-imagepublic.svg-image

我实现了- pasteboard(pasteboard:item:provideDataForType:)这样的方法:

  • 如果请求的类型是kPasteboardTypeFileURLPromise,我将获取粘贴位置,并在粘贴板中构建并设置 URL 字符串,其中包含将来应该写入文件的位置。

  • 如果请求的类型是kUTTypeFileURL,我下载文件,指定一个临时位置并将下载的文件写入该位置。然后,我在粘贴板中设置了该位置的 URL 字符串。

  • 如果请求的类型是其他类型之一,我下载文件并NSData在粘贴板中设置纯文本。

所有这些操作都在主线程上执行,产生了一些我想摆脱的滞后。

我尝试在后台线程上执行这些操作,然后返回主线程在粘贴板中设置最终数据,但这不起作用,因为该方法之前完成。

有谁知道实现它的方法?

4

1 回答 1

0

粘贴板类型的承诺通常意味着您已经拥有的另一种数据格式,您希望避免在必要之前进行转换的时间和内存费用。我认为使用它来延迟下载任何数据根本不合适。一方面,当最终请求下载时,下载可能会失败。另一方面,这可能需要任意长的时间,因为你现在正在努力。

所以,我认为你应该提前下载数据。要么将其保存在内存中,要么将其保存到临时文件中。如果合适,使用承诺的类型以不同的形式交付,但要提前准备好。

于 2015-09-05T20:44:08.747 回答