Ios 相位集不';t在PhaseSetChangeRequest完成后反映更改

Ios 相位集不';t在PhaseSetChangeRequest完成后反映更改,ios,photokit,phasset,Ios,Photokit,Phasset,文件中说: 照片运行更改块并调用完成处理程序后, 资产的状态反映了您在中请求的更改 街区 但是,在完成处理程序内部(以及在完成处理程序之后),我的阶段集没有改变。下面是我用来更改收藏状态的代码,它是从Phaset docs页面中提取的 - (IBAction)touchedButtonFavoritePhoto:(id)sender { AssetViewController *vc = self.viewControllers[0]; PHAsset *asset = vc.a

文件中说:

照片运行更改块并调用完成处理程序后, 资产的状态反映了您在中请求的更改 街区

但是,在完成处理程序内部(以及在完成处理程序之后),我的阶段集没有改变。下面是我用来更改收藏状态的代码,它是从Phaset docs页面中提取的

- (IBAction)touchedButtonFavoritePhoto:(id)sender {
    AssetViewController *vc = self.viewControllers[0];
    PHAsset *asset = vc.asset;

    NSLog(@"touched fav 1: %d", asset.favorite);

    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        // Create a change request from the asset to be modified.
        PHAssetChangeRequest *request = [PHAssetChangeRequest changeRequestForAsset:asset];
        // Set a property of the request to change the asset itself.
        request.favorite = !asset.favorite;
        NSLog(@"touched fav 2: %d", request.favorite);

    } completionHandler:^(BOOL success, NSError *error) {
        NSLog(@"Finished updating asset. %@: %d", (success ? @"Success." : error), asset.favorite);
        NSLog(@"touched fav 3: %d", asset.favorite);

        [self dispatchMainSynchronously:NO usingBlock:^{
            [self updateFavoriteButtonForAsset:asset];
            NSLog(@"touched fav 4: %d", asset.favorite);
        }];
    }];

    [self dispatchAfter:2.0 usingBlock:^{
        NSLog(@"touched fav 5: %d", asset.favorite);
    }];
}
上面的
-dispatchAfter:
-dispatchMain:
函数只是方便的函数,它们调用
gcd
函数在一定时间后异步执行块,或者在主UI线程上执行块

当我运行代码时,我看到它开始1)资产不是Fav,然后2)请求是Fav,3)资产仍然不是Fav,4)资产仍然不是Fav,5)资产仍然不是Fav

AppName[6155:3741600] startingPage.asset: <PHAsset: 0x1265f1b30> 4DFE1BBF-C16B-4150-8350-3FF1291B63B6/L0/001 mediaType=1/0, sourceType=1, (3264x2447), creationDate=2015-01-19 00:42:26 +0000, location=1, hidden=0, favorite=0 
AppName[6155:3741600] touched fav 1: 0
AppName[6155:3741879] touched fav 2: 1
AppName[6155:3741879] Finished updating asset. Success.: 0
AppName[6155:3741879] touched fav 3: 0
AppName[6155:3741600] touched fav 4: 0
AppName[6155:3741600] touched fav 5: 0
AppName[6155:3741600]startingPage.asset:4DFE1BBF-C16B-4150-8350-3FF1291B63B6/L0/001 mediaType=1/0,sourceType=1,(3264x2447),creationDate=2015-01-19 00:42:26+0000,location=1,hidden=0,favorite=0
AppName[6155:3741600]接触fav 1:0
AppName[6155:3741879]触及fav 2:1
AppName[6155:3741879]已完成更新资产。成功:0
AppName[6155:3741879]已接触fav 3:0
AppName[6155:3741600]接触fav 4:0
AppName[6155:3741600]接触fav 5:0

我做错了什么?为什么我的资产对象没有更新?

事实上,资产的属性已更改,但当PHPhotoLibrary没有使用更改对其进行修改时,它不会出现


您可以通过调用PHAsset的fetchAssetsWithLocalIdentifiers:方法来获取更新的资产,以查看正确的结果。

这是Photos框架中的一个错误。我认为这是一个9.2的回归。在所有以前的版本中,
收藏夹
状态在完成块中按照您的预期和文档状态正确更新

然而,我确实找到了一个解决办法。在
photoLibraryDidChange
中,请注意,在修改
收藏夹后,将提供此资产的更改详细信息。您将注意到,
objectAfterChanges
确实具有新的
收藏夹
状态。因此,与其在变更请求成功后立即更新UI,不如在交付变更详细信息后更新UI。例如:

//MARK: PHPhotoLibraryChangeObserver

func photoLibraryDidChange(changeInstance: PHChange) {
    guard let photoAsset = self.asset,
        let changeDetails = changeInstance.changeDetailsForObject(photoAsset)
        else { return }

    dispatch_async(dispatch_get_main_queue()) {
        self.asset = changeDetails.objectAfterChanges as? PHAsset

        //self.asset now has the proper favorite status
        self.updateFavoriteButton()

        if changeDetails.assetContentChanged {
            self.updateImage()
        }
    }
}

但是文件说,资产应该反映performChanges块中请求的更改。为什么我需要重新蚀刻它?是的,你提到的也是我在文档中看到的。我还没弄明白。我只做了一个关于设置更改的快速测试,并在照片应用程序中看到了结果,照片的属性最终确实发生了更改…是的,但“最终”并不能真正帮助我的用户的UI。:)我认为您可以通过fetchAssetsWithLocalIdentifiers:获取具有更新信息的阶段集,替换存储中的现有阶段集,然后自己触发UI更新。通过
fetchAssetsWithLocalIdentifiers
强制重新蚀刻不起作用-之后
收藏夹
状态仍然是旧值。