Наблюдатель изменений PHPhotoLibrary не вызывается

Кажется, у меня возникла случайная проблема, и я понятия не имею, почему это происходит. Кажется, я не могу заставить 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];
}

person klcjr89    schedule 09.06.2015    source источник
comment
О чем ты говоришь. Я захожу в приложение «Фотографии» и добавляю в избранное, удаляю из избранного и удаляю стоковые изображения.   -  person klcjr89    schedule 09.06.2015
comment
Вы не следите? Кода нет. Это манипулирование приложением «Фотографии», которое должно уведомлять вас об изменениях.   -  person klcjr89    schedule 09.06.2015
comment
@matt Да, я создал пустой проект с одним представлением, в котором ничего нет, чтобы попытаться выяснить, почему он сейчас не работает. Не грубо, это работало для меня в последние несколько дней, но не сейчас.   -  person klcjr89    schedule 09.06.2015
comment
@matt, это весь код. Но я переформатирую   -  person klcjr89    schedule 09.06.2015
comment
@matt я сократил код   -  person klcjr89    schedule 09.06.2015
comment
Приложение все еще работает, и мой наблюдатель за изменениями вызывался, даже когда приложение не было на переднем плане.   -  person klcjr89    schedule 09.06.2015
comment
У меня есть фоновая настройка в исходном рабочем приложении, поэтому изменения все равно будут опубликованы. Тогда это должно быть моей проблемой!   -  person klcjr89    schedule 09.06.2015


Ответы (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, я вижу в консоли «Здесь» — это ожидаемо, потому что мы получаем уведомление об изменении, когда библиотека «оживает» после авторизации. Именно так должен вести себя наблюдатель.

  • Все еще в Симуляторе, я нажал Shift-Command-H, чтобы перейти к трамплину. Я переключаюсь в приложение «Фотографии» и удаляю фотографию.

  • В симуляторе я дважды нажимаю Shift-Command-H, чтобы перейти к переключателю приложений.

  • В Симуляторе я нажимаю на все еще работающее тестовое приложение, чтобы вернуться к нему. За Симулятором в Xcode я вижу в консоли "Здесь", потому что пока мы отсутствовали, фото было удалено. Опять же, именно так должен вести себя наблюдатель.

person matt    schedule 09.06.2015
comment
это не сработает, если вы убьете приложение и перезапустите его, пока не зарегистрируетесь снова. - person Karthik; 01.12.2015
comment
@KarthikSadhasivam Конечно. Так? Это все равно, что сказать, что мой код не запустится, пока я его не запущу. Вроде очевидно. - person matt; 01.12.2015