2015-01-13 131 views
2

我在制作iOS 8扩展。以下是我想要做的事情:用户从容器应用程序中的照片库中选择图像,这些图像将与扩展名共享并供以后使用。iOS8扩展:在容器和扩展之间共享图像

现在我正在这样做(如果您不想阅读本部分内容,请跳到下面阅读实际代码):使用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安全吗?

谢谢。

回答

2

Apple's Documentation on App Extension Programming

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

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

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

.....

当您设置一个共享的容器,含应用程序和每个包含的应用程序扩展,你让参与数据共享,具有读取和写入访问共享容器。为避免数据损坏,您必须同步数据访问。使用Core Data,SQLite或Posix锁来帮助协调共享容器中的数据访问。

+0

另一个问题:当我使用NSDictionary的contentsOfDirectoryAtPath时,我应该使用相对路径还是绝对路径? – NSError

+1

[请看这里](http://www.atomicbird.com/blog/sharing-with-app-extensions):如果您需要共享更多的数据,而不是真正适用于用户默认的数据,则可以访问共享组目录直接通过NSFileManager NSURL * groupURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier: @“group.com.atomicbird.demonotes”];'[And here](http://blog.sam-oakley.co.uk/post/92323630293 /共享核心数据之间应用内和延伸入-IOS) – Lefteris