0

PHAssetCollection次のコードを使用して、新しい画像を、具体的にはカメラ ロール (別名ユーザー ライブラリ)に保存しようとしています。

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
    PHAssetChangeRequest *assetChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];

    PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil];
    PHAssetCollection *assetCollection = fetchResult[0];

    if (assetCollection) {
        PHAssetCollectionChangeRequest *assetCollectionChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
        [assetCollectionChangeRequest addAssets:@[[assetChangeRequest placeholderForCreatedAsset]]];
    }
} completionHandler:^(BOOL success, NSError *error) {
    if (!success) {
        NSLog(@"Error creating asset: %@", error);
    }
}];

私はいつもエラーが発生します。

実行ブロック内のすべてのオブジェクトは正常に見えます。

(lldb) po image
<UIImage: 0x174289ec0>, {1080, 1466}

(lldb) po assetCollection
<PHAssetCollection: 0x1741d5540> F6705124-D49B-4FDC-9191-7E84CFCCD148/L0/040 Camera Roll assetCollectionType=2/209

(lldb) po assetCollectionChangeRequest
<PHAssetCollectionChangeRequest: 0x170264640> title=(null) hasAssetChanges=1

そして、エラーメッセージはかなり役に立ちません:

The operation couldn’t be completed. (Cocoa error -1.)

新しい画像をユーザーのライブラリに正常に保存するにはどうすればよいですか? ありがとう。

4

1 に答える 1

2

一般に、間違った順序で物事を行っています。performChangesブロック内でフェッチを行うべきではありません。いずれにしても、そうする必要はありません。コレクションをまったく取得しないでください。最初の行とまったく同じように、プレーンでシンプルな写真を作成するだけです。ただし、変更リクエストへの参照を保持する必要さえありません。

[PHAssetChangeRequest creationRequestForAssetFromImage:image];

...そして停止します。その時点で、写真はカメラロールに追加されています。

これを試してみたところ、完全に機能します。

(もちろん、ユーザーから必要な権限を既に取得していると仮定しています...!)

于 2015-07-03T03:26:33.340 に答える