Commit 4cb1d871 authored by yuzheng's avatar yuzheng

优化图片保存策略,最多等待10次尝试获取PHAsset,发布3.4.2版本

parent 09a3ca0b
......@@ -8,7 +8,7 @@
## 重要提示1:提issue前,请先对照Demo、常见问题自查!Demo正常说明你可以升级下新版试试。
## 重要提示2:3.4.1版本适配了iOS14,修复2个严重问题,强烈建议尽快更新
## 重要提示2:3.4.2版本适配了iOS14,修复2个严重问题,强烈建议尽快更新
关于升级iOS10和Xcdoe8的提示:
在Xcode8环境下将项目运行在iOS10的设备/模拟器中,访问相册和相机需要额外配置info.plist文件。分别是Privacy - Photo Library Usage Description和Privacy - Camera Usage Description字段,详见Demo中info.plist中的设置。
......@@ -123,7 +123,7 @@ A:不要去拿PHImageFileURLKey,没用的,只有通过Photos框架才能
## 六. Release Notes 最近更新
**3.4.1 适配iOS14,若干问题修复**
**3.4.2 适配iOS14,若干问题修复**
3.3.2 适配iOS13,若干问题修复
3.2.1 新增裁剪用scaleAspectFillCrop属性,设置为YES后,照片尺寸小于裁剪框时会自动放大撑满
3.2.0 加入用NSOperationQueue控制获取原图并发数降低内存的示例
......
Pod::Spec.new do |s|
s.name = "TZImagePickerController"
s.version = "3.4.1"
s.version = "3.4.2"
s.summary = "A clone of UIImagePickerController, support picking multiple photos、original photo and video"
s.homepage = "https://github.com/banchichen/TZImagePickerController"
s.license = "MIT"
s.author = { "banchichen" => "tanzhenios@foxmail.com" }
s.platform = :ios
s.ios.deployment_target = "8.0"
s.source = { :git => "https://github.com/banchichen/TZImagePickerController.git", :tag => "3.4.1" }
s.source = { :git => "https://github.com/banchichen/TZImagePickerController.git", :tag => "3.4.2" }
s.requires_arc = true
s.resources = "TZImagePickerController/TZImagePickerController/*.{png,bundle}"
s.source_files = "TZImagePickerController/TZImagePickerController/*.{h,m}"
......
......@@ -807,7 +807,7 @@
INFOPLIST_FILE = TZImagePickerController/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 3.4.1;
MARKETING_VERSION = 3.4.2;
PRODUCT_BUNDLE_IDENTIFIER = tanzhenios2019.TZImagePickerController.www;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
......@@ -831,7 +831,7 @@
INFOPLIST_FILE = TZImagePickerController/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 3.4.1;
MARKETING_VERSION = 3.4.2;
PRODUCT_BUNDLE_IDENTIFIER = tanzhenios2019.TZImagePickerController.www;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE = "";
......@@ -918,7 +918,7 @@
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MARKETING_VERSION = 3.4.1;
MARKETING_VERSION = 3.4.2;
OTHER_LDFLAGS = "-all_load";
PRODUCT_BUNDLE_IDENTIFIER = tanzhen.TZImagePickerControllerFramework;
PRODUCT_NAME = TZImagePickerController;
......@@ -959,7 +959,7 @@
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
MARKETING_VERSION = 3.4.1;
MARKETING_VERSION = 3.4.2;
OTHER_LDFLAGS = "-all_load";
PRODUCT_BUNDLE_IDENTIFIER = tanzhen.TZImagePickerControllerFramework;
PRODUCT_NAME = TZImagePickerController;
......
......@@ -45,6 +45,7 @@
- (void)refreshFetchResult {
PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:self.collection options:self.options];
self.count = fetchResult.count;
[self setResult:fetchResult];
}
......
......@@ -485,8 +485,7 @@ static dispatch_once_t onceToken;
} completionHandler:^(BOOL success, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
if (success && completion) {
PHAsset *asset = [[PHAsset fetchAssetsWithLocalIdentifiers:@[localIdentifier] options:nil] firstObject];
completion(asset, nil);
[self fetchAssetByIocalIdentifier:localIdentifier retryCount:10 completion:completion];
} else if (error) {
NSLog(@"保存照片出错:%@",error.localizedDescription);
if (completion) {
......@@ -522,8 +521,7 @@ static dispatch_once_t onceToken;
[[NSFileManager defaultManager] removeItemAtPath:path error:nil];
dispatch_async(dispatch_get_main_queue(), ^{
if (success && completion) {
PHAsset *asset = [[PHAsset fetchAssetsWithLocalIdentifiers:@[localIdentifier] options:nil] firstObject];
completion(asset, nil);
[self fetchAssetByIocalIdentifier:localIdentifier retryCount:10 completion:completion];
} else if (error) {
NSLog(@"保存照片出错:%@",error.localizedDescription);
if (completion) {
......@@ -534,6 +532,19 @@ static dispatch_once_t onceToken;
}];
}
- (void)fetchAssetByIocalIdentifier:(NSString *)localIdentifier retryCount:(NSInteger)retryCount completion:(void (^)(PHAsset *asset, NSError *error))completion {
PHAsset *asset = [[PHAsset fetchAssetsWithLocalIdentifiers:@[localIdentifier] options:nil] firstObject];
if (asset || retryCount <= 0) {
if (completion) {
completion(asset, nil);
}
return;
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self fetchAssetByIocalIdentifier:localIdentifier retryCount:retryCount - 1 completion:completion];
});
}
#pragma mark - Save video
- (void)saveVideoWithUrl:(NSURL *)url completion:(void (^)(PHAsset *asset, NSError *error))completion {
......@@ -552,8 +563,7 @@ static dispatch_once_t onceToken;
} completionHandler:^(BOOL success, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
if (success && completion) {
PHAsset *asset = [[PHAsset fetchAssetsWithLocalIdentifiers:@[localIdentifier] options:nil] firstObject];
completion(asset, nil);
[self fetchAssetByIocalIdentifier:localIdentifier retryCount:10 completion:completion];
} else if (error) {
NSLog(@"保存视频出错:%@",error.localizedDescription);
if (completion) {
......
......@@ -4,7 +4,7 @@
//
// Created by 谭真 on 15/12/24.
// Copyright © 2015年 谭真. All rights reserved.
// version 3.4.1 - 2020.07.20
// version 3.4.2 - 2020.08.17
// 更多信息,请前往项目的github地址:https://github.com/banchichen/TZImagePickerController
/*
......
......@@ -4,7 +4,7 @@
//
// Created by 谭真 on 15/12/24.
// Copyright © 2015年 谭真. All rights reserved.
// version 3.4.1 - 2020.07.20
// version 3.4.2 - 2020.08.17
// 更多信息,请前往项目的github地址:https://github.com/banchichen/TZImagePickerController
#import "TZImagePickerController.h"
......
......@@ -44,6 +44,7 @@
@property (nonatomic, strong) UIImagePickerController *imagePickerVc;
@property (strong, nonatomic) CLLocation *location;
@property (nonatomic, strong) NSOperationQueue *operationQueue;
@property (nonatomic, assign) BOOL isSavingMedia;
@end
static CGSize AssetGridThumbnailSize;
......@@ -173,6 +174,8 @@ static CGFloat itemMargin = 5;
[self.view addSubview:_collectionView];
[_collectionView registerClass:[TZAssetCell class] forCellWithReuseIdentifier:@"TZAssetCell"];
[_collectionView registerClass:[TZAssetCameraCell class] forCellWithReuseIdentifier:@"TZAssetCameraCell"];
} else {
[_collectionView reloadData];
}
if (_showTakePhotoBtn) {
......@@ -830,7 +833,9 @@ static CGFloat itemMargin = 5;
UIImage *photo = [info objectForKey:UIImagePickerControllerOriginalImage];
NSDictionary *meta = [info objectForKey:UIImagePickerControllerMediaMetadata];
if (photo) {
self.isSavingMedia = YES;
[[TZImageManager manager] savePhotoWithImage:photo meta:meta location:self.location completion:^(PHAsset *asset, NSError *error){
self.isSavingMedia = NO;
if (!error && asset) {
[self addPHAsset:asset];
} else {
......@@ -845,7 +850,9 @@ static CGFloat itemMargin = 5;
[imagePickerVc showProgressHUD];
NSURL *videoUrl = [info objectForKey:UIImagePickerControllerMediaURL];
if (videoUrl) {
self.isSavingMedia = YES;
[[TZImageManager manager] saveVideoWithUrl:videoUrl location:self.location completion:^(PHAsset *asset, NSError *error) {
self.isSavingMedia = NO;
if (!error && asset) {
[self addPHAsset:asset];
} else {
......@@ -914,6 +921,9 @@ static CGFloat itemMargin = 5;
#pragma mark - PHPhotoLibraryChangeObserver
- (void)photoLibraryDidChange:(PHChange *)changeInstance {
if (self.isSavingMedia) {
return;
}
dispatch_async(dispatch_get_main_queue(), ^{
[self.model refreshFetchResult];
[self fetchAssetModels];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment