7

原因がわからないランダムな問題が発生しているようです。photoLibraryDidChange:(PHChange *)changeInstanceオブザーバーから呼び出されるようには見えません。いくつかの空のプロジェクトを作成しましたが、すべてがこの問題を示しています。最初のアプリのインストール時に変更オブザーバーが呼び出されることがありますが、写真アプリで変更を行った後に呼び出されることはありません。また、シミュレーターを無駄にリセットしました。提供されたヘルプに感謝します。

コード:

#import <UIKit/UIKit.h>
#import <Photos/Photos.h>

@interface ViewController : UIViewController <PHPhotoLibraryChangeObserver>

@end

- (void)viewDidLoad
{
    [super viewDidLoad];

    [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status)
     {
         if (status == PHAuthorizationStatusAuthorized)
         {
             [PHPhotoLibrary.sharedPhotoLibrary registerChangeObserver:self];

              dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^
              {
                 [self setup];
              });
         }
     }];
}

- (void)setup
{
    PHFetchOptions *fetchOptions = [[PHFetchOptions alloc]init];

    fetchOptions.wantsIncrementalChangeDetails = YES;

    PHFetchResult *smartAlbumsFetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAny options:fetchOptions];

    for (PHAssetCollection *sub in smartAlbumsFetchResult)
    {
        PHFetchResult *fetch = [PHAsset fetchAssetsInAssetCollection:sub options:fetchOptions];
    }
}

- (void)photoLibraryDidChange:(PHChange *)changeInstance
{
    NSLog(@"Not called");
}

- (void)dealloc
{
   [PHPhotoLibrary.sharedPhotoLibrary unregisterChangeObserver:self];
}
4

1 に答える 1

12

テストの仕方に問題があると思います。それは私にとってはうまくいきます。これが私がしたことです。

これは、私の 1 つのビュー コントローラーのコード全体です。

#import <UIKit/UIKit.h>
@import Photos;
#import "ViewController.h"

@interface ViewController() <PHPhotoLibraryChangeObserver>
@end
@implementation ViewController : UIViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    [PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
         if (status == PHAuthorizationStatusAuthorized) {
             [PHPhotoLibrary.sharedPhotoLibrary registerChangeObserver:self];
         }
     }];
}
- (void)photoLibraryDidChange:(PHChange *)changeInstance
{
    NSLog(@"Here");
}
@end
  • シミュレーターでアプリを実行します。承認が要求されます。許可します。Xcode が実行されているシミュレーターの背後で、コンソールに「Here」と表示されます。これは、承認後にライブラリが「有効になる」ときに変更通知を受け取るためです。それはまさにオブザーバーがどのように振る舞うべきかということです。

  • まだシミュレーターで、Shift-Command-H を押してスプリングボードに移動しました。写真アプリに切り替えて、写真を削除します。

  • シミュレーターでは、Shift-Command-H を 2 回押して、アプリ スイッチャーに移動しました。

  • シミュレーターで、まだ実行中のテスト アプリをクリックして戻ります。Xcode の Simulator の後ろに、コンソールに「Here」と表示されます。これは、外出中に写真が削除されたためです。繰り返しますが、それはまさにオブザーバーがどのように振る舞うべきかということです。

于 2015-06-09T04:14:56.757 に答える