2012-03-03 53 views
5

基本問題:如果您有一個資產URL並希望檢索該資產的圖像,您如何確實驗證該資產實際存在?請查看我的完整說明,瞭解我的意思。如何判斷資產URL是否實際指向現有資產?

我有一個應用程序,我正在開發,允許用戶將圖像分組爲「捆綁」進一步處理。這些圖像可以來自iTunes共享,設備的相機(如果已連接)或設備的照片庫。此外,用戶可以用一些基本方式編輯圖像。 「捆綁」可以長期存在;它們會在應用程序停止並啓動時被序列化和反序列化,以便應用程序的狀態在運行之間保持不變。

我原來的設計將圖像保存到應用程序的沙箱中。如果執行了任何編輯,圖像將被簡單地重寫爲本地文件。但是,如果包中包含大量圖像,則可能會導致圖像內容不必要的重複,從而導致不太理想的「文件系統」使用率。

我現在重新設計了它,因此如果圖像來自資產庫,我只需存儲資產的URL,並在需要實際顯示圖像或其內容時檢索它。當用戶編輯圖像時,它會寫入本地沙箱,就像我原來的設計一樣。我的應用程序會跟蹤圖像是來自本地文件系統還是來自資源庫。

我的應用程序未處於活動狀態時出現問題。用戶完全能夠進入照片應用程序並隨意移除圖像 - 包括我的應用程序存儲URL指針的圖像。

我做了「假如?」測試以查看在我的應用程序中如果用戶要做這樣的事情會發生什麼。我看到發生的事情有點意外。我寫了走包列表,使用下面的代碼驗證有資產的URL的所有圖像處理程序:

[assetLibrary 
    assetForURL:url 
    resultBlock:^(ALAsset *asset) { 
     _image = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]]; 
     // ... everything works! 
    } 
    failureBlock:^(NSError *error) { 
     NSLog(@"Asset verify failed"); 
     if (_image != nil) { 
      // I already have a reference to the UIImage... write it locally 
     } else { 
      // Image is nil and we have an empty image. 
     } 
    }]; 

在我的測試中,我從來沒有達到不良區。 Apple的文檔說「」如果用戶拒絕訪問應用程序,或者沒有應用程序被允許訪問數據,則調用失敗塊。「它沒有說明當URL不存在時會發生什麼。事實上,我的測試顯示,有人寫了一條NSLog()消息,「找不到具有UUID XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX的資產」(XXX由原始URL中的UUID替換)。儘管如此,這還不夠糟糕。我仍然可以在屏幕上的View Controller上看到UIImageView中的圖像,並且當我將視圖控制器彈出到父級時,系統會重置。

所以,我的問題是,有什麼辦法可以告訴資產網址是否真的存在?我不介意是否必須清空圖像(畢竟,用戶是刪除圖像的用戶!)。我不喜歡有一些已知的行爲路徑會持續導致設備重新啓動的想法;我無法將具有此行爲的應用程序提交給App Store。

有什麼建議嗎?當我在等待答案時,我仍然會對自己的一些想法進行自己的測試,但是我可以使用任何人們可以給我的建議。

謝謝!

+0

for iOS5 apple提供在NSURL類中查詢NSURL方法。#checkResourceIsReachableAndReturnError: # - isFileReferenceURL # - isFileURL。我沒有使用它,但可能是這可以幫助。 – Ravin 2012-03-03 19:09:06

+0

一個簡單的測試表明:'[url checkResourceIsReachableAndReturnError:&error]'總是爲資產返回NO,無論它們是否存在。任何其他想法? – lar3ry 2012-03-03 23:04:47

+0

順便說一下,其他兩個查詢也總是返回NO作爲資產URL。 – lar3ry 2012-03-03 23:11:28

回答

5

我有一個類似的問題 - 在resultBlocked我檢查資產參數爲零 - 如果它爲零,那麼資產沒有找到。