3

iOS 8 拡張機能を作成しています。私がやろうとしていることは次のとおりです: ユーザーはコンテナー アプリのフォト ライブラリから画像を選択し、これらの画像は拡張機能と共有され、さらに使用できるようになります。

現在、私はこの方法でそれを行っています (この部分を読みたくない場合は、以下をスキップして実際のコードを読んでください): Use App Group and NSUserDefaults to share data . 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]];
    }

convertArray は、取得したい画像の配列になります。

どうやら、私がこのようにすると多くの問題があるようです。たとえば、次の 2 つの大きな問題があります。

  • これを行うには、メモリを含む多くのリソースが必要です。実際に処理が完了するまでに 30 分ほどかかります。画像が 20 個程度の配列がある場合、「didRecieveMemoryWarning」が 3 回ほど発生します (テスト デバイスとして iPad mini を使用しています)。データが正しく保存されないことがあります。viewController がポップアウトされた後 (これは、保存しているコードの最後の行まで実行されることを意味します)、UserDefault に保存したばかりの配列に対して nil を取得します! 私のコーディングはすべて正常に機能したと確信しています。配列に含まれる画像が 15 未満の場合、それらを完全に保存および取得できるため、この問題はメモリ不足が原因です。

  • 以前に保存した配列に新しい画像を保存するのは困難です。これを行うには、前の配列を取得して新しい画像データをその配列に追加し、新しい配列を UserDefault に保存する必要があります。前述のように、配列を UserDefault に保存すると大量のメモリが必要になります。

したがって、私の質問は非常に率直で具体的です。

  1. あるターゲットから別のターゲットに画像を転送する他の方法はありますか? つまり、コンテナー アプリから拡張機能に画像を転送するにはどうすればよいでしょうか?
  2. そうでない場合、私のコードで問題を解決する方法はありますか? これは適切な方法ですか?

聞きたいことはこれだけですが、次の質問にも答えていただければ幸いです。

  1. 1 回の保存プロセスで複数の「didRecieveMemoryWarning」が表示されるのはなぜですか? システムがメモリ警告を受け取ったとき、すぐにアクションを停止しますか?
  2. (念のため)PNGとJPGを含むすべての画像にUIImagePNGRepresentationを使用しても安全ですか?

ありがとうございました。

4

1 に答える 1

2

App Extension Programming に関する Apple のドキュメントから

含まれているアプリとのデータの共有

拡張機能バンドルが含まれているアプリのバンドル内にネストされている場合でも、アプリ拡張機能とそれに含まれるアプリのセキュリティ ドメインは異なります。デフォルトでは、拡張機能とそれを含むアプリは、互いのコンテナーに直接アクセスできません。

ただし、データ共有を有効にすることはできます。たとえば、アプリの拡張機能とそれを含むアプリが、事前にレンダリングされたアセットなど、1 つの大きなデータ セットを共有できるようにする場合があります。

.....

共有コンテナーをセットアップすると、コンテナー アプリ (およびデータ共有への参加を許可するコンテナー アプリ拡張機能) には、共有コンテナーへの読み取りおよび書き込みアクセス権が付与されます。データの破損を回避するには、データ アクセスを同期する必要があります。Core Data、SQLite、または Posix ロックを使用して、共有コンテナー内のデータ アクセスを調整します。

于 2015-01-13T08:32:00.127 に答える