2011-12-02 20 views
11

我遇到了很多麻煩破譯Apple's documentation around UIManagedDocument,具體有以下幾種方法:如何將其他內容保存到我的UIManagedDocument文件包中?

  • - (id)additionalContentForURL:(NSURL *)absoluteURL error:(NSError **)error
  • - (BOOL)readAdditionalContentFromURL:(NSURL *)absoluteURL error:(NSError **)error
  • - (BOOL)writeAdditionalContent:(id)content toURL:(NSURL *)absoluteURL originalContentsURL:(NSURL *)absoluteOriginalContentsURL error:(NSError **)error

有沒有人成功地設法額外的內容保存到「他們的UIManagedDocument包內的「添加內容」目錄?我正在考慮使用UUID作爲文件名(使用正確的文件擴展名),將直接圖像(PNG,JPEG等)和視頻(m4v等)保存到此目錄中,並將對這些單獨文件的引用存儲爲NSString文件路徑我的持久性商店。

+0

你有沒有碰運氣?我正在研究同樣的事情。 –

回答

12

學分爲Apple DTS幫助我理解這堂課。我在這裏分享他們幫助我的一些例子(稍作修改)。

OK,所以基本上它的工作原理是這樣的:子類UIManagedDocument,並實現下面的方法(其中extraInfo屬性只是一個NSDictionary我們的子類實現):

- (BOOL)readAdditionalContentFromURL:(NSURL *)absoluteURL error:(NSError **)error 
{ 
    NSURL *myURL = [absoluteURL URLByAppendingPathComponent:@"AdditionalInformation.plist"]; 
    self.extraInfo = [NSDictionary dictionaryWithContentsOfURL:myURL]; 
    return YES; 
} 

- (id)additionalContentForURL:(NSURL *)absoluteURL error:(NSError **)error 
{ 
    if (!self.extraInfo) { 
     return [NSDictionary dictionaryWithObjectsAndKeys: @"Picard", @"Captain", [[NSDate date] description], @"RightNow", nil]; 
    } else { 
     NSMutableDictionary *updatedFriendInfo = [self.extraInfo mutableCopy]; 
     [updatedFriendInfo setObject:[[NSDate date] description] forKey:@"RightNow"]; 
     [updatedFriendInfo setObject:@"YES" forKey:@"Updated"]; 

     return updatedFriendInfo; 
    } 
} 

- (BOOL)writeAdditionalContent:(id)content toURL:(NSURL *)absoluteURL originalContentsURL:(NSURL *)absoluteOriginalContentsURL error:(NSError **)error 
{ 
    if (content) { 
     NSURL *myURL = [absoluteURL URLByAppendingPathComponent:@"AdditionalInformation.plist"]; 
     [(NSDictionary *)content writeToURL:myURL atomically:NO]; 
    } 

    return YES; 
} 

UIManagedDocument將調用這些方法時,需要自動將您需要保存的任何內容保存到AdditionalContent目錄內的文檔包中。

如果您需要強制保存,只需撥打您UIManagedDocument實例如下:

[self updateChangeCount:UIDocumentChangeDone]; 

目前,我沒有使用這個圖像和視頻 - 不過的例子應該給你足夠的走吧。

+0

太好了,非常感謝!我不確定的唯一情況是處理將附加到文檔的文件(例如照片,mp3等)。是否全部通過協調文件訪問到文檔的文件包裝的附加內容目錄手動完成? –

+1

所以基本上我要處理這個的方式是讀取/寫入任意文件的NSURL到附加到UIManagedDocument子類的數組中。當調用'readAdditionalContentFromURL:error:'方法時,獲取磁盤上的URL列表並存儲它。你可能會需要某種形式的緩存與子類關聯,你只要沖洗'writeAdditionalContent:的toURL:originalContentsURL:錯誤:'被稱爲真正的照片/ MP3音樂/等寫入磁盤。您可能選擇將文件存儲在臨時目錄中,直到發生這種刷新。 –

+1

我看不出一個非常乾淨的方式來做到這一點,所以考慮到我指定的iOS 5及更高版本爲這個項目我能在我的核心數據存儲二進制性質的外接存儲設備,我推圖像和視頻到我的執着存儲而不是附加的內容目錄。到目前爲止,這一直是一個合理的妥協,我還沒有見過性能或行爲的任何問題(我知道別人有外部存儲)。 對不起,這不是一個完美的答案,但像很多與iCloud中添加的API的,我不認爲蘋果已經完成歸檔^ H^H^H^H^H^H^H^H^H^H^H他們。 –

3

-additionalContentForURL:error:的文檔指示返回一個nil應該表示出現錯誤。

A return value of nil indicates an error condition. To avoid generating 
    an exception, you must return a value from this method. If it is not always 
    the case that there will be additional content, you should return a sentinel value (for example, an NSNull instance) that you check for in 
    writeAdditionalContent:toURL:originalContentsURL:error:. 

我重寫-writeContents:andAttributes:safelyToURL:forSaveOperation:error:用於其他目的(在第一次做的一些東西保存新文檔的),並調用超級調用NSException神,因爲contents價值爲零,而不是一個NSDictionary由UIManagedDocument看似預期。嗯。

你知道得越多...

P.S.我猜這取決於-writeContents:andAttributes的一天中的時間:...它曾經拋出一個異常抱怨期待NSDictionary,但後來拋出一個異常抱怨說,我沒有通過它的NSData。我的眉毛不能像現在那樣以更像Spock的方式提升。

相關問題