iOS8 扩展:在容器和扩展之间共享图像
iOS8 extension : share images between container and extension
我正在制作 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 将是我想要获取的图像数组。
显然,我这样做会有很多问题。
比如两大问题:
这样做会占用大量资源,包括内存。实际完成 process.If 大约需要半分钟 我有一个包含大约 20 张图像的数组,我将得到 "didRecieveMemoryWarning" 大约 3 次(我正在使用 iPad mini 作为测试设备)。 有时数据保存不正确。 viewController 弹出后(这意味着它运行到我的存储代码的最后一行), 我刚刚保存到 UserDefault 的数组得到 nil! 我'我确定我的编码工作正常,这个问题是由内存不足引起的,因为如果数组中的图像少于 15 个,我可以完美地保存和检索它们。
很难将新图像保存到以前保存的数组中。当我想这样做时,我必须检索以前的数组并将新的图像数据添加到该数组中,然后将新数组保存到 UserDefault 中。如前所述,将数组保存到 UserDefault 中会占用大量内存。
所以我的问题非常直接和具体:
- 是否有任何其他方法可以将图像从一个目标传输到另一个目标?换句话说:如何将图像从容器应用程序传输到扩展程序?
- 如果不是,有什么方法可以解决我的代码中的问题吗?这是正确的做法吗?
我想问的就这些了,如果你也能帮我回答下面的问题,那就太好了:
- 为什么我在一个保存过程中会得到多个"didRecieveMemoryWarning"?当系统收到内存警告时,会立即停止动作吗?
- (只是为了确定)对包括 PNG 和 JPG 在内的所有图像使用 UIImagePNGRepresentation 是否安全?
谢谢。
来自 Apple's Documentation on App Extension Programming
与包含的应用程序共享数据
应用扩展及其包含应用的安全域是不同的,即使扩展包嵌套在包含应用的包中也是如此。默认情况下,您的扩展及其包含的应用无法直接访问彼此的容器。
但是,您可以启用数据共享。例如,您可能希望允许您的应用扩展及其包含的应用共享一组大型数据,例如预渲染资产。
.....
当您设置共享容器时,包含的应用程序以及您允许参与数据共享的每个包含的应用程序扩展程序都具有对共享容器的读写权限。 为避免数据损坏,您必须同步数据访问。使用 Core Data、SQLite 或 Posix 锁来帮助协调共享容器中的数据访问。
我正在制作 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 将是我想要获取的图像数组。
显然,我这样做会有很多问题。 比如两大问题:
这样做会占用大量资源,包括内存。实际完成 process.If 大约需要半分钟 我有一个包含大约 20 张图像的数组,我将得到 "didRecieveMemoryWarning" 大约 3 次(我正在使用 iPad mini 作为测试设备)。 有时数据保存不正确。 viewController 弹出后(这意味着它运行到我的存储代码的最后一行), 我刚刚保存到 UserDefault 的数组得到 nil! 我'我确定我的编码工作正常,这个问题是由内存不足引起的,因为如果数组中的图像少于 15 个,我可以完美地保存和检索它们。
很难将新图像保存到以前保存的数组中。当我想这样做时,我必须检索以前的数组并将新的图像数据添加到该数组中,然后将新数组保存到 UserDefault 中。如前所述,将数组保存到 UserDefault 中会占用大量内存。
所以我的问题非常直接和具体:
- 是否有任何其他方法可以将图像从一个目标传输到另一个目标?换句话说:如何将图像从容器应用程序传输到扩展程序?
- 如果不是,有什么方法可以解决我的代码中的问题吗?这是正确的做法吗?
我想问的就这些了,如果你也能帮我回答下面的问题,那就太好了:
- 为什么我在一个保存过程中会得到多个"didRecieveMemoryWarning"?当系统收到内存警告时,会立即停止动作吗?
- (只是为了确定)对包括 PNG 和 JPG 在内的所有图像使用 UIImagePNGRepresentation 是否安全?
谢谢。
来自 Apple's Documentation on App Extension Programming
与包含的应用程序共享数据
应用扩展及其包含应用的安全域是不同的,即使扩展包嵌套在包含应用的包中也是如此。默认情况下,您的扩展及其包含的应用无法直接访问彼此的容器。
但是,您可以启用数据共享。例如,您可能希望允许您的应用扩展及其包含的应用共享一组大型数据,例如预渲染资产。
.....
当您设置共享容器时,包含的应用程序以及您允许参与数据共享的每个包含的应用程序扩展程序都具有对共享容器的读写权限。 为避免数据损坏,您必须同步数据访问。使用 Core Data、SQLite 或 Posix 锁来帮助协调共享容器中的数据访问。