首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免使用NSDraggingSession阻止主线程

避免使用NSDraggingSession阻止主线程
EN

Stack Overflow用户
提问于 2015-09-05 18:26:12
回答 1查看 574关注 0票数 4

在Mac应用程序(Cocoa)中,我使用NSDraggingSession将一些图像从我的应用程序复制到其他应用程序。NSDraggingItem利用实现协议NSPasteboardItemDataProvider的对象,在用户删除数据时提供数据。

在我处理图像时,涉及的类型有:NSPasteboardTypePNGkPasteboardTypeFileURLPromisekUTTypeFileURLcom.adobe.photoshop-imagepublic.svg-image。这些图片是在一个遥远的位置,所以我可以提供他们到黑板,我必须从互联网下载他们。

我实现了- pasteboard(pasteboard:item:provideDataForType:)方法,这样做如下:

  • 如果所请求的类型是kPasteboardTypeFileURLPromise,我将得到粘贴位置,并在剪贴板中构建并设置URL字符串,其中包含未来应该写入文件的位置。
  • 如果请求的类型是kUTTypeFileURL,我将下载该文件,指定一个临时位置,并将下载的文件写入该位置。然后,我在剪贴板上设置位置的URL字符串。
  • 如果所请求的类型是其他类型之一,则下载该文件并在pasteboard中设置普通NSData

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

我尝试在后台线程上执行这些操作,然后返回主线程,以设置pasteboard中的最终数据,但这不起作用,因为该方法已经完成。

有谁知道实现这个目标的方法吗?

EN

回答 1

Stack Overflow用户

发布于 2015-09-05 20:44:08

承诺的纸板类型通常意味着作为一种替代格式的数据,您已经有,在这里,您希望避免在时间和内存的费用转换之前,它是必要的。我认为使用它来推迟下载任何数据都是不合适的。首先,当最终被请求时,下载可能会失败。另一方面,它可能需要一段任意长的时间,因为你现在正在挣扎。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32416376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档