我在制作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需要很多内存。
所以我的问题是相当直盼着和具体:
- 还有没有其他的方法可以从一个目标的图像传输到另一个?换句话说:我如何将图像从容器应用程序传输到扩展?
- 如果不是,有什么方法可以解决我的代码中的问题?这是一个正确的方法来做到这一点?
这些都是我要问,但如果你能回答也跟我的问题,这将是非常好的:
- 我为什么要在一个储蓄得到一个以上的“didRecieveMemoryWarning”处理?当系统收到内存警告时,它会立即停止操作吗?
- (只是为了确保)对于包括PNG和JPG在内的所有图像,使用UIImagePNGRepresentation安全吗?
谢谢。
另一个问题:当我使用NSDictionary的contentsOfDirectoryAtPath时,我应该使用相对路径还是绝对路径? – NSError
[请看这里](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