3

Существует проблема с плохо подобранными абстракциями в какао, которые возникают, когда вы пытаетесь объединить панель предварительного просмотра 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, и я не могу делать никаких предположений о ее внутренних действиях.

ответ

-1

Вы можете использовать:

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

} 

и

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

К сожалению, это не решает ни одну из проблем, изложенных в моем посте. –

 Смежные вопросы

  • Нет связанных вопросов^_^