gpt4 book ai didi

ios - 为什么我的 PHFetchResultChangeDetails 已更改索引,而我所做的只是在最后插入?

转载 作者:技术小花猫 更新时间:2023-10-29 11:06:46 25 4
gpt4 key购买 nike

我正在使用照片框架编写一个 iOS8 应用程序。我真的很喜欢 PHFetchResultChangeDetails。但是有些事情我不明白:当我使用以下代码将新照片保存到相机胶卷时,我会取回插入和更改。我只希望插入。

具体来说:

[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{

PHAssetChangeRequest* newPhotoChangeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
PHAssetCollectionChangeRequest* albumChangeRequest = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:_album];
[albumChangeRequest addAssets:[NSArray arrayWithObject:newPhotoChangeRequest.placeholderForCreatedAsset]];
...

操作是使用上面的代码插入3张照片。之前:ipad 上的 5 张照片。之后:ipad 中的 8 张照片。PHFetResultChangeDetails 处理程序上的断点显示:

(lldb) po insertionIndexPaths
<__NSArrayM 0x7913be10>(
<NSIndexPath: 0x78e39020> {length = 2, path = 0 - 5},
<NSIndexPath: 0x78e3c910> {length = 2, path = 0 - 6},
<NSIndexPath: 0x78e39480> {length = 2, path = 0 - 7}
)

--> 好:有道理!这些是我刚刚插入的照片(最后 3 个索引路径)。

(lldb) po changeIndexPaths
<__NSArrayM 0x78e3c420>(
<NSIndexPath: 0x78e3c7e0> {length = 2, path = 0 - 2},
<NSIndexPath: 0x78e3c7a0> {length = 2, path = 0 - 3},
<NSIndexPath: 0x78e3c7b0> {length = 2, path = 0 - 4}
)

--> 不明白:为什么这些被认为是“改变的”?这些是相机胶卷中现有的照片……我没有对它们做任何事情。

感谢您的帮助。

更新:看起来它可能与选择有关。我没有提到,当已经选择了一些单元格时会发生这种情况。我看到的是,当在 collectionView 的末尾插入新项目时,一些选定的单元格会随机取消选择——我认为是那些具有 changeIndexPaths 的单元格。哇,太糟糕了——我看不出我的代码怎么能做到这一点!有什么提示吗?

UPDATE2: 因此,伪造的 changeIndexPaths 似乎始终是插入路径(始终位于末尾)之前的 3 个 indexPaths。为什么?!

UPDATE3:我还看到 UICollectionView 的 performBatchUpdates 崩溃,当数据源事先正确更新时,如果有插入和重新加载。例如,当更改看起来像这样时:

<PHFetchResultChangeDetails: 0x1742b91a0> 
before=<PHFetchResult: 0x1702b5d20> count=31,
after=<PHFetchResult: 0x1702b5ea0> count=33,
hasIncremental=1 deleted=(null),
inserted=<NSMutableIndexSet: 0x17444aef0>[number of indexes: 2 (in 2 ranges), indexes: (30 32)],
changed=<NSMutableIndexSet: 0x17444a9b0>[number of indexes: 4 (in 2 ranges), indexes: (27-29 31)],
hasMoves=0

...然后我的应用程序在 performBatchUpdates 中崩溃并出现异常:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to delete item 31 from section 0 which only contains 31 items before the update'

这是我直接从 Apple 文档 (!) 复制的 performBatchUpdates 代码,所以我看不出为什么 changeIndexPaths 包含索引 31,因为在插入之前,count=31:

 [self.collectionView performBatchUpdates:^{

if( deletionIndexPaths.count )
[self.collectionView deleteItemsAtIndexPaths:deletionIndexPaths];
if( insertionIndexPaths.count )
[self.collectionView insertItemsAtIndexPaths:insertionIndexPaths];
if( changeIndexPaths.count )
[self.collectionView reloadItemsAtIndexPaths:changeIndexPaths];
if( moveBlock )
moveBlock(self.collectionView);
} ...

最佳答案

回复:更新 3

尽管示例代码怎么说,changedIndexes 不能像这样在 performBatchUpdates 中使用。

索引 PHFetchResultChangeDetails.changedIndexes 是相对于原始提取结果之后删除了 removedIndexes 中的索引,之后添加了 insertedIndexes 中的新索引。

但是,UITableView 和 UICollectionView API 要求在批量更新中调用 reloadItems* 方法时,具有来自任何其他更改的索引。

要解决此问题,请在批量更新之外调用重新加载和移动条目,例如:

    [self.collectionView performBatchUpdates:^{

if( deletionIndexPaths.count )
[self.collectionView deleteItemsAtIndexPaths:deletionIndexPaths];
if( insertionIndexPaths.count )
[self.collectionView insertItemsAtIndexPaths:insertionIndexPaths];
} ... ]
if( changeIndexPaths.count )
[self.collectionView reloadItemsAtIndexPaths:changeIndexPaths];
if( moveBlock )
moveBlock(self.collectionView);

关于ios - 为什么我的 PHFetchResultChangeDetails 已更改索引,而我所做的只是在最后插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27290061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com