From c5e87ef67b3852581480f0254dd840a6a38525a4 Mon Sep 17 00:00:00 2001 From: yuzheng Date: Mon, 14 Jan 2019 11:03:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E7=94=A8NSOperationQueue?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E8=8E=B7=E5=8F=96=E5=8E=9F=E5=9B=BE=E5=B9=B6?= =?UTF-8?q?=E5=8F=91=E6=95=B0=E9=99=8D=E4=BD=8E=E5=86=85=E5=AD=98=E7=9A=84?= =?UTF-8?q?=E7=A4=BA=E4=BE=8B=EF=BC=9B=E5=8F=91=E5=B8=833.1.9=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + TZImagePickerController.podspec | 4 +- .../project.pbxproj | 6 ++ TZImagePickerController/Info.plist | 2 +- .../TZImagePickerController/TZImageManager.h | 1 + .../TZImagePickerController/TZImageManager.m | 7 ++ .../TZImagePickerController.h | 2 +- .../TZImagePickerController.m | 2 +- .../TZImageRequestOperation.h | 8 +++ .../TZImageRequestOperation.m | 9 --- .../TZImageUploadOperation.h | 17 +++++ .../TZImageUploadOperation.m | 69 +++++++++++++++++++ TZImagePickerController/ViewController.m | 28 ++++---- TZImagePickerControllerFramework/Info.plist | 2 +- 14 files changed, 128 insertions(+), 30 deletions(-) create mode 100644 TZImagePickerController/TZImageUploadOperation.h create mode 100644 TZImagePickerController/TZImageUploadOperation.m diff --git a/README.md b/README.md index 5a602eb2..fc5173e2 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,7 @@ A:不要去拿PHImageFileURLKey,没用的,只有通过Photos框架才能 ## 六. Release Notes 最近更新 +3.1.9 加入用NSOperationQueue控制获取原图并发数降低内存的示例 3.1.8 批量获取图片时加入队列控制,尝试优化大批量选择图片时CPU和内存占用过高的问题(仍然危险,maxImagesCount谨慎设置过大...) 3.1.5 相册内无照片时给出提示,修复快速滑动时内存一直增加的问题 3.1.3 适配阿拉伯等语言下从右往左布局的特性 diff --git a/TZImagePickerController.podspec b/TZImagePickerController.podspec index 6c7bbd71..bb749ffa 100644 --- a/TZImagePickerController.podspec +++ b/TZImagePickerController.podspec @@ -1,13 +1,13 @@ Pod::Spec.new do |s| s.name = "TZImagePickerController" - s.version = "3.1.8" + s.version = "3.1.9" 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.1.8" } + s.source = { :git => "https://github.com/banchichen/TZImagePickerController.git", :tag => "3.1.9" } s.requires_arc = true s.resources = "TZImagePickerController/TZImagePickerController/*.{png,bundle}" s.source_files = "TZImagePickerController/TZImagePickerController/*.{h,m}" diff --git a/TZImagePickerController.xcodeproj/project.pbxproj b/TZImagePickerController.xcodeproj/project.pbxproj index 4e29638e..96829807 100644 --- a/TZImagePickerController.xcodeproj/project.pbxproj +++ b/TZImagePickerController.xcodeproj/project.pbxproj @@ -29,6 +29,7 @@ 900EF00F1C2C0B1100EA709B /* TZAssetModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 900EF00E1C2C0B1100EA709B /* TZAssetModel.m */; }; 900EF0121C2C107400EA709B /* TZPhotoPreviewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 900EF0111C2C107400EA709B /* TZPhotoPreviewController.m */; }; 900EF0161C2C134900EA709B /* TZPhotoPreviewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 900EF0141C2C134900EA709B /* TZPhotoPreviewCell.m */; }; + 9019FD8D21EC25D7009ADEAE /* TZImageUploadOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 9019FD8C21EC25D7009ADEAE /* TZImageUploadOperation.m */; }; 901CC3FA21CB757500C55443 /* TZImageRequestOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 901CC3F821CB757500C55443 /* TZImageRequestOperation.h */; }; 901CC3FB21CB757500C55443 /* TZImageRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 901CC3F921CB757500C55443 /* TZImageRequestOperation.m */; }; 901CC3FC21CB758500C55443 /* TZImageRequestOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 901CC3F921CB757500C55443 /* TZImageRequestOperation.m */; }; @@ -155,6 +156,8 @@ 900EF0111C2C107400EA709B /* TZPhotoPreviewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TZPhotoPreviewController.m; sourceTree = ""; }; 900EF0131C2C134800EA709B /* TZPhotoPreviewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TZPhotoPreviewCell.h; sourceTree = ""; }; 900EF0141C2C134900EA709B /* TZPhotoPreviewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TZPhotoPreviewCell.m; sourceTree = ""; }; + 9019FD8B21EC25D7009ADEAE /* TZImageUploadOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TZImageUploadOperation.h; sourceTree = ""; }; + 9019FD8C21EC25D7009ADEAE /* TZImageUploadOperation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TZImageUploadOperation.m; sourceTree = ""; }; 901CC3F821CB757500C55443 /* TZImageRequestOperation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TZImageRequestOperation.h; sourceTree = ""; }; 901CC3F921CB757500C55443 /* TZImageRequestOperation.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TZImageRequestOperation.m; sourceTree = ""; }; 901F2290215CABD600F604ED /* FLAnimatedImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FLAnimatedImage.h; sourceTree = ""; }; @@ -254,6 +257,8 @@ 900E65831C2BB8D5003D9A9E /* AppDelegate.m */, 900E65851C2BB8D5003D9A9E /* ViewController.h */, 900E65861C2BB8D5003D9A9E /* ViewController.m */, + 9019FD8B21EC25D7009ADEAE /* TZImageUploadOperation.h */, + 9019FD8C21EC25D7009ADEAE /* TZImageUploadOperation.m */, 6D32B9BB1CD83640005CE1E0 /* LxGridViewFlowLayout.h */, 6D32B9BC1CD83640005CE1E0 /* LxGridViewFlowLayout.m */, 9038D58F1C3974F0007DE549 /* TZTestCell.h */, @@ -583,6 +588,7 @@ 901F2295215CABD600F604ED /* FLAnimatedImage.m in Sources */, 900E65841C2BB8D5003D9A9E /* AppDelegate.m in Sources */, 901F2296215CABD600F604ED /* FLAnimatedImageView.m in Sources */, + 9019FD8D21EC25D7009ADEAE /* TZImageUploadOperation.m in Sources */, 900E65811C2BB8D5003D9A9E /* main.m in Sources */, 900EF0121C2C107400EA709B /* TZPhotoPreviewController.m in Sources */, 901CC3FC21CB758500C55443 /* TZImageRequestOperation.m in Sources */, diff --git a/TZImagePickerController/Info.plist b/TZImagePickerController/Info.plist index d1b47442..4ef19477 100644 --- a/TZImagePickerController/Info.plist +++ b/TZImagePickerController/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 3.1.8 + 3.1.9 CFBundleSignature ???? CFBundleVersion diff --git a/TZImagePickerController/TZImagePickerController/TZImageManager.h b/TZImagePickerController/TZImagePickerController/TZImageManager.h index ca295781..4ba1c5f6 100755 --- a/TZImagePickerController/TZImagePickerController/TZImageManager.h +++ b/TZImagePickerController/TZImagePickerController/TZImageManager.h @@ -70,6 +70,7 @@ /// 如下两个方法completion一般会调多次,一般会先返回缩略图,再返回原图(详见方法内部使用的系统API的说明),如果info[PHImageResultIsDegradedKey] 为 YES,则表明当前返回的是缩略图,否则是原图。 - (PHImageRequestID)getOriginalPhotoWithAsset:(PHAsset *)asset completion:(void (^)(UIImage *photo,NSDictionary *info))completion; - (PHImageRequestID)getOriginalPhotoWithAsset:(PHAsset *)asset newCompletion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion; +- (PHImageRequestID)getOriginalPhotoWithAsset:(PHAsset *)asset progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler newCompletion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion; // 该方法中,completion只会走一次 - (PHImageRequestID)getOriginalPhotoDataWithAsset:(PHAsset *)asset completion:(void (^)(NSData *data,NSDictionary *info,BOOL isDegraded))completion; - (PHImageRequestID)getOriginalPhotoDataWithAsset:(PHAsset *)asset progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler completion:(void (^)(NSData *data,NSDictionary *info,BOOL isDegraded))completion; diff --git a/TZImagePickerController/TZImagePickerController/TZImageManager.m b/TZImagePickerController/TZImagePickerController/TZImageManager.m index 4b668f45..970f530d 100755 --- a/TZImagePickerController/TZImagePickerController/TZImageManager.m +++ b/TZImagePickerController/TZImagePickerController/TZImageManager.m @@ -423,8 +423,15 @@ - (PHImageRequestID)getOriginalPhotoWithAsset:(PHAsset *)asset completion:(void } - (PHImageRequestID)getOriginalPhotoWithAsset:(PHAsset *)asset newCompletion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion { + return [self getOriginalPhotoWithAsset:asset progressHandler:nil newCompletion:completion]; +} + +- (PHImageRequestID)getOriginalPhotoWithAsset:(PHAsset *)asset progressHandler:(void (^)(double progress, NSError *error, BOOL *stop, NSDictionary *info))progressHandler newCompletion:(void (^)(UIImage *photo,NSDictionary *info,BOOL isDegraded))completion { PHImageRequestOptions *option = [[PHImageRequestOptions alloc]init]; option.networkAccessAllowed = YES; + if (progressHandler) { + [option setProgressHandler:progressHandler]; + } option.resizeMode = PHImageRequestOptionsResizeModeFast; return [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFit options:option resultHandler:^(UIImage *result, NSDictionary *info) { BOOL downloadFinined = (![[info objectForKey:PHImageCancelledKey] boolValue] && ![info objectForKey:PHImageErrorKey]); diff --git a/TZImagePickerController/TZImagePickerController/TZImagePickerController.h b/TZImagePickerController/TZImagePickerController/TZImagePickerController.h index 1aefccc6..7d9de246 100644 --- a/TZImagePickerController/TZImagePickerController/TZImagePickerController.h +++ b/TZImagePickerController/TZImagePickerController/TZImagePickerController.h @@ -4,7 +4,7 @@ // // Created by 谭真 on 15/12/24. // Copyright © 2015年 谭真. All rights reserved. -// version 3.1.8 - 2019.01.14 +// version 3.1.9 - 2019.01.14 // 更多信息,请前往项目的github地址:https://github.com/banchichen/TZImagePickerController /* diff --git a/TZImagePickerController/TZImagePickerController/TZImagePickerController.m b/TZImagePickerController/TZImagePickerController/TZImagePickerController.m index 13ddd537..d9f25141 100644 --- a/TZImagePickerController/TZImagePickerController/TZImagePickerController.m +++ b/TZImagePickerController/TZImagePickerController/TZImagePickerController.m @@ -4,7 +4,7 @@ // // Created by 谭真 on 15/12/24. // Copyright © 2015年 谭真. All rights reserved. -// version 3.1.8 - 2019.01.14 +// version 3.1.9 - 2019.01.14 // 更多信息,请前往项目的github地址:https://github.com/banchichen/TZImagePickerController #import "TZImagePickerController.h" diff --git a/TZImagePickerController/TZImagePickerController/TZImageRequestOperation.h b/TZImagePickerController/TZImagePickerController/TZImageRequestOperation.h index 2820e36d..89b9676e 100644 --- a/TZImagePickerController/TZImagePickerController/TZImageRequestOperation.h +++ b/TZImagePickerController/TZImagePickerController/TZImageRequestOperation.h @@ -16,7 +16,15 @@ NS_ASSUME_NONNULL_BEGIN typedef void(^TZImageRequestCompletedBlock)(UIImage *photo, NSDictionary *info, BOOL isDegraded); typedef void(^TZImageRequestProgressBlock)(double progress, NSError *error, BOOL *stop, NSDictionary *info); +@property (nonatomic, copy, nullable) TZImageRequestCompletedBlock completedBlock; +@property (nonatomic, copy, nullable) TZImageRequestProgressBlock progressBlock; +@property (nonatomic, strong, nullable) PHAsset *asset; + +@property (assign, nonatomic, getter = isExecuting) BOOL executing; +@property (assign, nonatomic, getter = isFinished) BOOL finished; + - (instancetype)initWithAsset:(PHAsset *)asset completion:(TZImageRequestCompletedBlock)completionBlock progressHandler:(TZImageRequestProgressBlock)progressHandler; +- (void)done; @end NS_ASSUME_NONNULL_END diff --git a/TZImagePickerController/TZImagePickerController/TZImageRequestOperation.m b/TZImagePickerController/TZImagePickerController/TZImageRequestOperation.m index 40b016a4..71cfea5d 100644 --- a/TZImagePickerController/TZImagePickerController/TZImageRequestOperation.m +++ b/TZImagePickerController/TZImagePickerController/TZImageRequestOperation.m @@ -9,15 +9,6 @@ #import "TZImageRequestOperation.h" #import "TZImageManager.h" -@interface TZImageRequestOperation () -@property (nonatomic, copy) TZImageRequestCompletedBlock completedBlock; -@property (nonatomic, copy) TZImageRequestProgressBlock progressBlock; -@property (nonatomic, strong) PHAsset *asset; - -@property (assign, nonatomic, getter = isExecuting) BOOL executing; -@property (assign, nonatomic, getter = isFinished) BOOL finished; -@end - @implementation TZImageRequestOperation @synthesize executing = _executing; diff --git a/TZImagePickerController/TZImageUploadOperation.h b/TZImagePickerController/TZImageUploadOperation.h new file mode 100644 index 00000000..bd535b44 --- /dev/null +++ b/TZImagePickerController/TZImageUploadOperation.h @@ -0,0 +1,17 @@ +// +// TZImageUploadOperation.h +// TZImagePickerController +// +// Created by 谭真 on 2019/1/14. +// Copyright © 2019 谭真. All rights reserved. +// + +#import "TZImageRequestOperation.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface TZImageUploadOperation : TZImageRequestOperation + +@end + +NS_ASSUME_NONNULL_END diff --git a/TZImagePickerController/TZImageUploadOperation.m b/TZImagePickerController/TZImageUploadOperation.m new file mode 100644 index 00000000..b0f78275 --- /dev/null +++ b/TZImagePickerController/TZImageUploadOperation.m @@ -0,0 +1,69 @@ +// +// TZImageUploadOperation.m +// TZImagePickerController +// +// Created by 谭真 on 2019/1/14. +// Copyright © 2019 谭真. All rights reserved. +// + +#import "TZImageUploadOperation.h" +#import "TZImageManager.h" + +@implementation TZImageUploadOperation + +- (void)start { + NSLog(@"TZImageUploadOperation start"); + self.executing = YES; + dispatch_async(dispatch_get_global_queue(0, 0), ^{ +#pragma mark - 获取&上传大图 + /* + [[TZImageManager manager] getPhotoWithAsset:self.asset completion:^(UIImage *photo, NSDictionary *info, BOOL isDegraded) { + dispatch_async(dispatch_get_main_queue(), ^{ + if (!isDegraded) { + if (self.completedBlock) { + self.completedBlock(photo, info, isDegraded); + } + // 在这里上传图片(代码略),图片上传完毕后调用[self done] + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self done]; + }); + } + }); + } progressHandler:^(double progress, NSError *error, BOOL *stop, NSDictionary *info) { + dispatch_async(dispatch_get_main_queue(), ^{ + if (self.progressBlock) { + self.progressBlock(progress, error, stop, info); + } + }); + } networkAccessAllowed:YES]; + */ + +#pragma mark - 获取&上传原图 + [[TZImageManager manager] getOriginalPhotoWithAsset:self.asset progressHandler:^(double progress, NSError *error, BOOL *stop, NSDictionary *info) { + dispatch_async(dispatch_get_main_queue(), ^{ + if (self.progressBlock) { + self.progressBlock(progress, error, stop, info); + } + }); + } newCompletion:^(UIImage *photo, NSDictionary *info, BOOL isDegraded) { + dispatch_async(dispatch_get_main_queue(), ^{ + if (!isDegraded) { + if (self.completedBlock) { + self.completedBlock(photo, info, isDegraded); + } + // 在这里上传图片(代码略),图片上传完毕后调用[self done] + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + [self done]; + }); + } + }); + }]; + }); +} + +- (void)done { + [super done]; + // NSLog(@"TZImageUploadOperation done"); +} + +@end diff --git a/TZImagePickerController/ViewController.m b/TZImagePickerController/ViewController.m index a92031fe..9eed46fa 100644 --- a/TZImagePickerController/ViewController.m +++ b/TZImagePickerController/ViewController.m @@ -20,6 +20,7 @@ #import "TZAssetCell.h" #import #import "FLAnimatedImage.h" +#import "TZImageUploadOperation.h" @interface ViewController () { NSMutableArray *_selectedPhotos; @@ -34,6 +35,8 @@ @interface ViewController ()= assets.count) { - NSLog(@"All finished."); - } + // 图片上传operation,上传代码请写到operation内的start方法里,内有注释 + TZImageUploadOperation *operation = [[TZImageUploadOperation alloc] initWithAsset:asset completion:^(UIImage * photo, NSDictionary *info, BOOL isDegraded) { + if (isDegraded) return; + NSLog(@"图片获取&上传完成"); + } progressHandler:^(double progress, NSError * _Nonnull error, BOOL * _Nonnull stop, NSDictionary * _Nonnull info) { + NSLog(@"获取原图进度 %f", progress); }]; - NSLog(@"requestId: %d", requestId); + [self.operationQueue addOperation:operation]; } - */ } // If user picking a video and allowPickingMultipleVideo is NO, this callback will be called. diff --git a/TZImagePickerControllerFramework/Info.plist b/TZImagePickerControllerFramework/Info.plist index 518e8be7..ebbc444c 100644 --- a/TZImagePickerControllerFramework/Info.plist +++ b/TZImagePickerControllerFramework/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 3.1.8 + 3.1.9 CFBundleVersion $(CURRENT_PROJECT_VERSION) NSPrincipalClass