簡體   English   中英

iOS8擴展:在容器和擴展之間共享圖像

[英]iOS8 extension : share images between container and extension

我正在進行iOS 8擴展。 這就是我要做的事情:用戶從容器應用程序中的照片庫中選擇圖像,這些圖像將與擴展程序共享並供進一步使用。

現在我正在這樣做(如果你不想閱讀這部分內容,請跳過下面的內容閱讀實際代碼): 使用App Group和NSUserDefaults共享數據 將UIImage轉換為NSData,然后將所有圖像保存在NSArray中,然后將數組保存到NSDictionary中(我有很多數組,這就是我組織它們的方式 - 所以我必須將它們保存到字典中),最后將字典保存到用戶默認。

這是編碼:

  NSArray *imageArray = ... 
 //this array contains all the images.
 //photoDataArray is a NSMutableArray;
  photoDataArray = [[NSMutableArray alloc]init];
for (UIImage *images in imageArray) {
    [photoDataArray addObject:UIImagePNGRepresentation(images)];
}
    NSThread * creationThread = [[NSThread alloc] initWithTarget:self selector:@selector(handleData) object:nil];
    [creationThread start];
     -(void)handleData{
        NSDictionary *dic = [[NSDictionary alloc]init];
        [dic SetObject:photoDataArray forKey:@"testImageArray"];
        NSUserDefaults *   def = [[NSUserDefaults alloc] initWithSuiteName:@"group.myCompany.myApp"];
        [def setObject:dic forKey:@"dataDic"];
//done with saving data
        [self.navigationController popViewControllerAnimated:YES];
//Navigation
}

當我想要檢索圖像時:

NSUserDefaults *   def = [[NSUserDefaults alloc] initWithSuiteName:@"group.myCompany.myApp"];
NSDictionary *dic = [def ObjectForKey:@"dataDic"];

  NSArray *dataArray = [dic objectForKey:@"testImageArray"];
    NSMutableArray *convertedArray = [[NSMutableArray alloc] init];
    for (NSData *imageData in dataArray) {
        [convertedArray addObject:[UIImage imageWithData:imageData]];
    }

convertedArray將是我想要的圖像數組。

顯然,如果我這樣做會有很多問題。 例如,兩個主要問題:

  • 這樣做需要很多資源,包括內存。 實際完成這個過程需要大約半分鍾。如果我有一個包含大約20張圖像的數組,我會得到“didRecieveMemoryWarning”大約3次(我使用iPad mini作為測試設備)。 有時數據未正確保存 在彈出viewController后(這意味着它運行到我的存儲代碼的最后一行), 我剛剛保存到UserDefault中的數組為零! 我確信我的編碼工作正常,這個問題是由內存不足引起的,因為如果陣列的圖像少於15個,我可以完美地保存和檢索它們。

  • 將新圖像保存到以前保存的數組中很困難 當我想這樣做時,我必須檢索先前的數組並將新的圖像數據添加到該數組中,然后將新數組保存到UserDefault中。 如前所述,將數組保存到UserDefault會占用大量內存。

所以我的問題非常直接且具體:

  1. 有沒有其他方法可以將圖像從一個目標傳輸到另一個目標? 換句話說:如何將圖像從容器應用程序傳輸到擴展程序?
  2. 如果沒有,有沒有辦法解決我的代碼中的問題? 這是一個正確的方法嗎?

這些都是我想問的問題,但如果你能為我回答以下問題,那將是非常好的:

  1. 為什么我會在一個保存過程中獲得多個“didRecieveMemoryWarning”? 當系統收到內存警告時,它會立即停止操作嗎?
  2. (只是為了確保)對包括PNG和JPG在內的所有圖像使用UIImagePNGRepresentation是否安全?

謝謝。

來自Apple的App擴展編程文檔

與您的應用程序共享數據

應用程序擴展及其包含應用程序的安全域是不同的,即使擴展包嵌套在包含應用程序的包中。 默認情況下,您的擴展程序及其包含的應用程序無法直接訪問彼此的容器。

但是,您可以啟用數據共享。 例如,您可能希望允許您的應用擴展程序及其包含的應用程序共享一組大量數據,例如預渲染資產。

.....

設置共享容器時,包含應用程序 - 以及允許參與數據共享的每個包含的應用程序擴展 - 都具有對共享容器的讀寫權限。 要避免數據損壞,必須同步數據訪問。 使用Core Data,SQLite或Posix鎖來幫助協調共享容器中的數據訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM