From 6fb0d3cf1e6fe37c6fe497df53467f219f17205e Mon Sep 17 00:00:00 2001 From: xiaoxiao Date: Thu, 5 Feb 2026 20:52:48 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=BD=93=20(insertedCount=20=3D=3D=200=20&?= =?UTF-8?q?&=20removedCount=20=3D=3D=200=20&&=20changedCount=20>=201)=20?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E7=9B=B4=E6=8E=A5=E9=80=80=E5=87=BAreturn=20?= =?UTF-8?q?=E3=80=82=E4=B8=8D=E8=BF=9B=E8=A1=8C=E5=88=B7=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TZImagePickerController/TZPhotoPickerController.m | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/TZImagePickerController/TZImagePickerController/TZPhotoPickerController.m b/TZImagePickerController/TZImagePickerController/TZPhotoPickerController.m index d60f84a0..1964e5ba 100755 --- a/TZImagePickerController/TZImagePickerController/TZPhotoPickerController.m +++ b/TZImagePickerController/TZImagePickerController/TZPhotoPickerController.m @@ -1144,7 +1144,9 @@ - (void)photoLibraryDidChange:(PHChange *)changeInstance { NSInteger insertedCount = changeDetail.insertedObjects.count; NSInteger removedCount = changeDetail.removedObjects.count; NSInteger changedCount = changeDetail.changedObjects.count; - if (insertedCount > 0 || removedCount > 0 || changedCount > 0) { + if (insertedCount == 0 && removedCount == 0 && changedCount > 1) { + return; + } else if (insertedCount > 0 || removedCount > 0 || changedCount > 0) { self.model.result = changeDetail.fetchResultAfterChanges; self.model.count = changeDetail.fetchResultAfterChanges.count; [self fetchAssetModels]; From 223e49c2005ac56c8164b73ad7b1aefbc8e382b9 Mon Sep 17 00:00:00 2001 From: xiaoxiao Date: Fri, 6 Feb 2026 10:55:46 +0800 Subject: [PATCH 2/3] =?UTF-8?q?changedCount=20>=200=20=E6=89=8D=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TZImagePickerController/TZPhotoPickerController.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TZImagePickerController/TZImagePickerController/TZPhotoPickerController.m b/TZImagePickerController/TZImagePickerController/TZPhotoPickerController.m index 1964e5ba..08f7ffd9 100755 --- a/TZImagePickerController/TZImagePickerController/TZPhotoPickerController.m +++ b/TZImagePickerController/TZImagePickerController/TZPhotoPickerController.m @@ -1144,7 +1144,7 @@ - (void)photoLibraryDidChange:(PHChange *)changeInstance { NSInteger insertedCount = changeDetail.insertedObjects.count; NSInteger removedCount = changeDetail.removedObjects.count; NSInteger changedCount = changeDetail.changedObjects.count; - if (insertedCount == 0 && removedCount == 0 && changedCount > 1) { + if (insertedCount == 0 && removedCount == 0 && changedCount > 0) { return; } else if (insertedCount > 0 || removedCount > 0 || changedCount > 0) { self.model.result = changeDetail.fetchResultAfterChanges; From 2c63e3b4d2761fc3793bb5d25b4385eb6697e8e5 Mon Sep 17 00:00:00 2001 From: xiaoxiao Date: Wed, 11 Feb 2026 11:57:51 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat(photo):=20=E5=AE=9E=E7=8E=B0=E7=9B=B8?= =?UTF-8?q?=E5=86=8C=E5=8F=98=E6=9B=B4=E7=9A=84=E7=B2=BE=E7=A1=AEasset?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 当仅有资产属性变更时,替换全量刷新为针对性更新 - 添加 updateAssetModels: 方法以高效处理特定资产更新 - 通过仅重新加载受影响的集合视图项目来提升UI性能 - 在优化更新的同时保持现有功能的兼容性 --- .../TZPhotoPickerController.m | 62 ++++++++++++++++++- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/TZImagePickerController/TZImagePickerController/TZPhotoPickerController.m b/TZImagePickerController/TZImagePickerController/TZPhotoPickerController.m index 08f7ffd9..ef04ab61 100755 --- a/TZImagePickerController/TZImagePickerController/TZPhotoPickerController.m +++ b/TZImagePickerController/TZImagePickerController/TZPhotoPickerController.m @@ -1144,8 +1144,14 @@ - (void)photoLibraryDidChange:(PHChange *)changeInstance { NSInteger insertedCount = changeDetail.insertedObjects.count; NSInteger removedCount = changeDetail.removedObjects.count; NSInteger changedCount = changeDetail.changedObjects.count; - if (insertedCount == 0 && removedCount == 0 && changedCount > 0) { - return; + + // 只 changed:精准更新 + if (insertedCount == 0 && removedCount == 0 && changedCount > 0 && !changeDetail.hasMoves) { + NSArray *changedAssets = [[changeDetail changedObjects] copy]; + self.model.result = changeDetail.fetchResultAfterChanges; + self.model.count = changeDetail.fetchResultAfterChanges.count; + // 使用 updateAssetModels 方法更新特定资产 + [self updateAssetModels:changedAssets]; } else if (insertedCount > 0 || removedCount > 0 || changedCount > 0) { self.model.result = changeDetail.fetchResultAfterChanges; self.model.count = changeDetail.fetchResultAfterChanges.count; @@ -1170,6 +1176,58 @@ - (void)handleRemovedAssets:(NSArray *)removedObjects { } } +#pragma mark - Update Asset Models + +// 更新特定的asset models +- (void)updateAssetModels:(NSArray *)changedAssets { + + TZImagePickerController *tzImagePickerVc = (TZImagePickerController *)self.navigationController; + dispatch_async(dispatch_get_global_queue(0, 0), ^{ + + CGFloat systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; + if (!tzImagePickerVc.sortAscendingByModificationDate && self->_model.isCameraRoll) { + [[TZImageManager manager] getCameraRollAlbumWithFetchAssets:YES completion:^(TZAlbumModel *model) { + self->_model = model; + self->_models = [NSMutableArray arrayWithArray:self->_model.models]; + }]; + } else if (self->_showTakePhotoBtn || !self.model.models || systemVersion >= 14.0) { + [[TZImageManager manager] getAssetsFromFetchResult:self->_model.result completion:^(NSArray *models) { + self->_models = [NSMutableArray arrayWithArray:models]; + }]; + } else { + self->_models = [NSMutableArray arrayWithArray:self->_model.models]; + } + + // 通过对比 localIdentifier 来找到索引 + NSMutableArray *updatedIndexes = [NSMutableArray array]; + for (PHAsset *asset in changedAssets) { + for (int i = 0; i < self.model.count; i++) { + TZAssetModel *currentModel = self->_models[i]; + if ([currentModel.asset.localIdentifier isEqualToString:asset.localIdentifier]) { + [updatedIndexes addObject:@(i)]; + break; + } + } + } + + if (updatedIndexes.count > 0) { + NSMutableArray *indexPaths = [NSMutableArray array]; + for (NSNumber *indexNum in updatedIndexes) { + NSIndexPath *indexPath = [NSIndexPath indexPathForItem:[indexNum intValue] inSection:0]; + [indexPaths addObject:indexPath]; + } + + // 重载指定的items + dispatch_async(dispatch_get_main_queue(), ^{ + [self.collectionView reloadItemsAtIndexPaths:indexPaths]; + }); + } else { + NSLog(@"updateAssetModels no changes, models.count:%ld", (long)self.model.count); + } + + }); +} + #pragma mark - Asset Caching - (void)resetCachedAssets {