iOS8扩展:在容器和扩展之间共享图像

我正在做一个iOS 8的扩展。 以下是我想要做的:用户从容器应用程序中的照片库中select图像,这些图像将与扩展名共享并供进一步使用。

现在我正在这样做(如果你不想读这个部分,请跳过下面的代码): 使用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张图片的数组,我会得到大约3次的“didRecieveMemoryWarning”(我使用iPad mini作为testing设备)。 有时数据不能正确保存 。 在viewController被popup(这意味着它运行到我的存储代码的最后一行)后, 我得到了我刚刚保存到UserDefault的数组nil! 我敢肯定,我的代码都正常工作,这个问题是由低内存,因为如果数组less于15个图像,我可以保存和检索完美。

  • 将新图像保存到先前保存的arrays中很困难 。 当我想这样做时,我必须检索前面的数组并将新的图像数据添加到该数组中,然后将新数组保存到UserDefault中。 如前所述,将数组保存到UserDefault需要大量的内存。

所以我的问题是相当直接的和具体的:

  1. 有没有其他方法将图像从一个目标转移到另一个目标? 换句话说:我如何将图像从容器应用程序传输到扩展?
  2. 如果没有,有没有办法解决我的代码中的问题? 这是一个正确的方法来做到这一点?

这些都是我想问的,但如果你也可以为我回答以下问题,那将是非常好的:

  1. 为什么我会在一个保存过程中获得多个“didRecieveMemoryWarning”? 当系统收到内存警告时,会立即停止操作吗?
  2. (只是为了确保)所有的图像,包括PNG和JPG使用UIImagePNGRepresentation是安全的吗?

谢谢。

从苹果的应用程序扩展编程文档

与您的包含应用程序共享数据

即使扩展程序包嵌套在包含应用程序的包中,应用程序扩展的安全域及其包含的应用程序也是不同的。 默认情况下,您的扩展程序及其包含的应用程序不能直接访问彼此的容器。

但是,您可以启用数据共享。 例如,您可能希望允许您的应用扩展程序及其包含的应用程序共享一组较大的数据,例如预渲染的资源。

…..

在设置共享容器时,包含的应用程序(每个包含允许参与数据共享的应用程序扩展)都具有对共享容器的读写访问权限。 为避免数据损坏,您必须同步数据访问。 使用Core Data,SQLite或Posix锁来帮助协调共享容器中的数据访问。