【问题标题】:iOS8 extension : share images between container and extensioniOS8 扩展:在容器和扩展之间共享图像
【发布时间】:2015-01-13 08:12:37
【问题描述】:

我正在制作 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 个图像的数组,我将收到大约 3 次“didRecieveMemoryWarning”(我使用 iPad mini 作为测试设备)。 有时数据未正确保存。在 viewController 弹出后(这意味着它运行到我存储代码的最后一行),我刚刚保存到 UserDefault 中的数组得到 nil! 我确定我的编码一切正常,而这个问题是由于内存不足造成的,因为如果数组少于15张图片,我可以完美地保存和检索它们。

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

所以我的问题非常直接和具体:

  1. 还有其他方法可以将图像从一个目标传输到另一个目标吗?换句话说:如何将图像从容器应用传输到扩展?
  2. 如果没有,有什么方法可以解决我的代码中的问题吗?这是一种正确的方法吗?

这些都是我想问的,但如果你也能为我回答以下问题,那就太好了:

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

谢谢。

【问题讨论】:

    标签: ios objective-c ios8 nsuserdefaults ios-extensions


    【解决方案1】:

    来自Apple's Documentation on App Extension Programming

    与包含的应用共享数据

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

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

    .....

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

    【讨论】:

    • 另一个问题:当我使用NSDictionary的contentsOfDirectoryAtPath时,我应该使用相对路径还是绝对路径?
    • Take a look here :如果您需要共享比用户默认设置更多的数据,您可以通过 NSFileManager NSURL *groupURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier: @"group.com.atomicbird.demonotes"]; And here 直接访问共享组目录
    猜你喜欢
    • 2014-07-26
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多