Существует проблема с плохо подобранными абстракциями в какао, которые возникают, когда вы пытаетесь объединить панель предварительного просмотра Quick Look и URL с областью безопасности.Как правильно реализовать источник данных QLPreviewPanel, имея в виду URL-адреса с областью безопасности?
У меня есть конкретный пример:
Imagine мы пытаемся показать предварительный просмотр для некоторых объектов из MediaLibrary (MediaLibrary.framework позволяет приложениям просматривать Iphoto, Aperture ... и фото библиотеки через удобный API) ,
Самый простой и простой способ сделать так, чтобы адаптировать класс «MLMediaObject» (которые представляют определенную фотографию или видеосюжет) для реализации протокола в «QLPreviewItem» (который может быть передан в 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
местоположении объекта мультимедиа. (только для чтения)
Это свойство предоставляется как URL с областью безопасности. Чтобы получить доступ к файлу, к которому относится этот URL-адрес, вызывающий абонент должен позвонитьstartAccessingSecurityScopedResource
до иstopAccessingSecurityScopedResource
после использования URL-адреса для доступа к файлу.
Таким образом, очевидно, что доступ к ресурсу должен быть в квадратных скобках с парой вызовов в startAccessingSecurityScopedResource
/stopAccessingSecurityScopedResource
.
Вопрос в том, где я должен поставить эти вызовы с учетом текущего определения протокола QLPreviewPanelDataSource
? Это зависит от QLPreviewPanel, чтобы получить доступ к ресурсу, а не к моему коду, но, к сожалению, я почти никогда не верю, что Apple обновила QL для работы в среде с песочницей.
Как обращаться с случаями, когда startAccessingSecurityScopedResource
Call возвращает NO
, заявив о невозможности получить доступ?
Похоже, что когда вы пытаетесь использовать startAccessingSecurityScopedResource
по URL-адресу, к которому вы уже обращаетесь, вы получаете ответный флажок сбоя. Например, все в порядке, но вы получаете флаг ошибки. Кажется, что эти старт/стоп ... звонки должны быть сопряжены точно, и даже сбалансированное вложение запрещено. Итак, как разграничить две возможности, когда вы получаете NO
по возврату: URL-адрес с областью безопасности, к которому уже обращаются, и URL-адрес безопасности, который не удалось «разрешить»?
Это экспериментально подтвержденный факт, что ваше приложение может получить доступ только к конечному количеству URL-адресов, защищенных системой безопасности (вы можете использовать около 1500 URL-адресов, прежде чем они перестанут работать). Итак, как я должен правильно отказаться от доступа к URL-адресам с защитой безопасности после того, как я передал их в QLPreviewPanel? Когда это подходящее время? Мне кажется, что это частная реализация класса QLPreviewPanel, и я не могу делать никаких предположений о ее внутренних действиях.
К сожалению, это не решает ни одну из проблем, изложенных в моем посте. –