Photos 框架实践以及坑

实时监听iOS相册变化,使用实例方法registerchange,每当有相册变化就会触发photoLibraryDidChange方法,此时可以在回调中做刷新操作。

但是!!!! 相册变化包括文件夹变化,视频或图片添加删除变化,视频或图片修改的变化,都会触发这个方法,而你不能每次接收到通知都去刷新一遍,这样会出问题的。

一个解决方案是,拿到具体是什么变化,然后做响应的处理,此处有不少坑,建议自己去试一下

最佳实践是,判断视频或图片数量,如果变化了就刷新即可,数量不变化则不响应

监听与取消


- (void)PH_initPHPhotoLibrary
{
    @synchronized (self) {
        [[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self];
    }
}

- (void)PH_deinitPHPhotoLibrary
{
    @synchronized (self) {
        [[PHPhotoLibrary sharedPhotoLibrary] unregisterChangeObserver:self];
    }
}

监听方法

- (void)photoLibraryDidChange:(PHChange *)changeInstance
{
   /*
    通过changeDetailsForFetchResult:获取的PHFetchResultChangeDetails对象,
    包含了 FetchResult 的结果的所有变化情况以及 FetchResult 的成员变化前后的数据,
    需要注意的是成员变化的通知。
    */
    PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeVideo options:nil];
    NSUInteger count = [result countOfAssetsWithMediaType:PHAssetMediaTypeVideo];
    static NSUInteger isloading = 0;
    if (isloading == count) {
        LogInfo(NSStringFromClass([self class]),@"相册更新了,但是系统多次通知回调,视频数目%d并没变化,不重复刷新了,过滤掉",(int)count);
        return;
    }
    isloading = count;
    LogInfo(NSStringFromClass([self class]), @"相册更新了 && 发送通知 %@ 视频数目 %d", changeInstance,(int)count);
    [[NSNotificationCenter defaultCenter] postNotificationName:notify_photoLibraryDidChange object:nil];  
}

你可能感兴趣的:(Photos 框架实践以及坑)