gpt4 book ai didi

objective-c - 如何正确实现 QLPreviewPanel 数据源并牢记安全范围的 URL?

转载 作者:搜寻专家 更新时间:2023-10-30 19:50:09 26 4
gpt4 key购买 nike

当人们试图将 Quick Look 预览面板和安全范围的 URL 组合在一起时,会出现 Cocoa 中选择不当、不可组合的抽象问题。

我有一个具体的例子:

想象一下,我们正在尝试显示 MediaLibrary 中某些对象的预览(MediaLibrary.framework 允许应用程序通过方便的 API 浏览 iPhoto、Aperture...和照片库)。

最简单直接的方法是调整“MLMediaObject”类(代表特定照片或视频项目)以实现“QLPreviewItem”协议(protocol)(可以传递给 QLPreviewPanel):

MLMediaObject+PreviewItem.h

#import <MediaLibrary/MLMediaObject.h>

#import <Quartz/Quartz.h>

@interface MLMediaObject (PreviewItem) <QLPreviewItem>

@end

MLMediaObject+PreviewItem.m

#import "MLMediaObject+PreviewItem.h"

@implementation MLMediaObject (PreviewItem)

- (NSURL*) previewItemURL
{
return self.URL;
}

- (NSString*) previewItemTitle
{
return self.name;
}

@end

简单。现在想象以下 QLPreviewPanel 数据源实现:

AlbumViewController.m

- (NSInteger) numberOfPreviewItemsInPreviewPanel: (QLPreviewPanel*) panel
{
// 'currentAlbum' property contains the currently-represented MLMediaGroup object.
return self.currentAlbum.count;
}

- (id<QLPreviewItem>) previewPanel: (QLPreviewPanel*) panel previewItemAtIndex: (NSInteger) index
{
return self.currentAlbum[index];
}

到目前为止一切顺利。但是,如果我们查看稀疏且通常具有误导性的 Apple 文档,我们可能会发现以下重要细节:

URL
The location of the media object. (read-only)
This property is provided as a security-scoped URL. In order to gain access to the file that this URL refers to, the caller must call startAccessingSecurityScopedResource before and stopAccessingSecurityScopedResource after using the URL to access the file.

因此,很明显,对资源的访问必须用 startAccessingSecurityScopedResource/stopAccessingSecurityScopedResource 调用对括起来。

问题是,根据当前的 QLPreviewPanelDataSource 协议(protocol)定义,我应该将这些调用放在哪里?访问资源取决于 QLPreviewPanel,而不是我的代码,但不幸的是我几乎不会相信 Apple 更新了 QL 以在沙盒环境中运行。

startAccessingSecurityScopedResource 调用返回 NO 时,我该如何处理这些情况,说明无法获得访问权限?

似乎当您尝试在已被访问的 URL 上 startAccessingSecurityScopedResource 时,您会在返回时收到失败标志。就像,一切正常,但你得到一个错误标志。似乎这些开始/停止...调用必须精确配对,甚至禁止平衡嵌套。 那么,当您返回 NO 时,如何区分两种可能性:已经被访问的安全范围 URL 和未能“解析”的安全范围 URL?

这是一个经过实验证明的事实,您的应用程序只能访问有限数量的安全范围的 URL(您可以访问大约 1500 个 URL,然后它会静静地停止工作)。那么,在将安全范围的 URL 传递给 QLPreviewPanel 之后,我应该如何正确地放弃对它们的访问权限?什么时候这样做合适?在我看来,它是 QLPreviewPanel 类的私有(private)实现细节,我无法对其内部工作方式做出任何假设。

最佳答案

您可以使用:

- (void)beginPreviewPanelControl:(QLPreviewPanel *)panel {
[bookmarkURL startAccessingSecurityScopedResource];
//... Your code

}

- (void)endPreviewPanelControl:(QLPreviewPanel *)panel {
//... Your Code
[bookmarkURL stopAccessingSecurityScopedResource];
}

关于objective-c - 如何正确实现 QLPreviewPanel 数据源并牢记安全范围的 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30195609/

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