如果看過(guò)了之前的三片文章,其實(shí)會(huì)發(fā)現(xiàn)自始至終,除了有幾個(gè)和系統(tǒng)的交互會(huì)展示一張圖片外,一張圖片都沒(méi)有看到,我們一直看到的只是一個(gè)數(shù)字或者簡(jiǎn)單的信息。
如果一定要來(lái)做個(gè)比喻的話,前面介紹的都是準(zhǔn)備的子彈,現(xiàn)在缺少一個(gè)能使用子彈的槍,而且是沖鋒槍,而這個(gè)沖鋒槍就是PHImageManager。
通過(guò)PHImageManager我們可以獲取到確切的圖片并展示出來(lái),其使用過(guò)程也很簡(jiǎn)單,針對(duì)Image、Live Photo、Video都有不同的方法相對(duì)應(yīng)。
下面就簡(jiǎn)單的看看Image相關(guān)的使用吧。
PHImageManager
注意??:該類下的size都是像素單位,并不是之前常用的點(diǎn)。因?yàn)樘O果的不同手機(jī)的分辨率不同,所以在得到像素之前,要先獲取比例,使用方法[UIScreen mainScreen].scale即可獲取到,然后就可轉(zhuǎn)換為相應(yīng)的像素單位。
其使用步驟,蘋果在其官方文檔中也做了如下說(shuō)明:
1、使用PHAsset獲取到你想要的資源
2、使用類方法[PHImageManager defaultManager]獲取到PHImageManager對(duì)象
3、調(diào)用PHImageManager相關(guān)的方法獲取數(shù)據(jù)
上面的三步,最難的就是第三步,因?yàn)檫@里的每個(gè)方法的注意點(diǎn)都不一樣。目前,就只是針對(duì)圖片的兩個(gè)方法做個(gè)簡(jiǎn)單的介紹吧,其他的如果在后面有需求或者時(shí)間,再做更新:
- (PHImageRequestID)requestImageForAsset:(PHAsset *)asset targetSize:(CGSize)targetSize contentMode:(PHImageContentMode)contentMode options:(nullable PHImageRequestOptions *)options resultHandler:(void (^)(UIImage *__nullable result, NSDictionary *__nullable info))resultHandler;
- (PHImageRequestID)requestImageDataForAsset:(PHAsset *)asset options:(nullable PHImageRequestOptions *)options resultHandler:(void(^)(NSData *__nullable imageData, NSString *__nullable dataUTI, UIImageOrientation orientation, NSDictionary *__nullable info))resultHandler;
-
- (PHImageRequestID)requestImageForAsset:(PHAsset *)asset targetSize:(CGSize)targetSize contentMode:(PHImageContentMode)contentMode options:(nullable PHImageRequestOptions *)options resultHandler:(void (^)(UIImage *__nullable result, NSDictionary *__nullable info))resultHandler;
參數(shù)說(shuō)明:
1、asset:要展示的那個(gè)圖片的資源
2、targetSize:想要返回的圖片的尺寸,注意這里的單位是像素;另外,還有一個(gè)全局常量,用來(lái)表示圖片的原始尺寸或者盡可能大的尺寸:PHImageManagerMaximumSize,使用該常量,會(huì)忽略參數(shù)contentMode,它一般得到的是原圖
3、contentMode:是個(gè)枚舉,有兩個(gè)值可供選擇:PHImageContentModeAspectFit(默認(rèn))和PHImageContentModeAspectFill其意義和UIImageView的contentMode是相通的,前者按比例放大,直到有一邊到了邊界就不再放大,該模式下你會(huì)看到完整的圖片,但是有可能會(huì)有空白;后者按比例放大,直到兩條邊里的最后一對(duì)到達(dá)邊界,該模式下的到的圖片可能會(huì)存在有一對(duì)邊超出邊界的情況,造成圖片缺失。
4、options:用來(lái)定義一些屬性,其中最常用的屬性應(yīng)該是isSynchronous,該屬性定義了是異步執(zhí)行還是同步執(zhí)行,需要注意的是如果是同步執(zhí)行的話,該請(qǐng)求是不能被停止的;另一個(gè)屬性是networkAccessAllowed,表示是否允許從iCloud請(qǐng)求圖片。
需要注意的是,如果實(shí)在異步線程中,這里的返回不一定就是在異步線程,也不一定就是在主線程。
1、options的synchronous設(shè)置為YES
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
PHImageRequestOptions * options = [[PHImageRequestOptions alloc] init];
options.synchronous = YES;
[[PHImageManager defaultManager] requestImageForAsset:_dataSourceArr.firstObject.asset targetSize:_thumbilImageSize contentMode:PHImageContentModeAspectFill options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
NSLog(@"%@", [NSThread currentThread]);
}];
NSLog(@"finished");
});

這種情況下,打印log可以看出是在當(dāng)前線程同步執(zhí)行返回的,而且只執(zhí)行一次
2、options為nil,或者說(shuō)options的synchronous設(shè)置為NO
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"before:%@", [NSThread currentThread]);
[[PHImageManager defaultManager] requestImageForAsset:_dataSourceArr.firstObject.asset targetSize:_thumbilImageSize contentMode:PHImageContentModeAspectFill options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
NSLog(@"request:%@", [NSThread currentThread]);
}];
NSLog(@"finished");
});

打印log可以看出,會(huì)在當(dāng)前線程異步執(zhí)行多次,除了最后一次會(huì)在主線程返回之外,其他的都在當(dāng)前線程執(zhí)行。
3、size為PHImageManagerMaximumSize
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"before:%@", [NSThread currentThread]);
[[PHImageManager defaultManager] requestImageForAsset:_dataSourceArr.firstObject.asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFill options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
NSLog(@"request:%@", [NSThread currentThread]);
}];
NSLog(@"finished");
});

從log中可以看出,異步執(zhí)行,只執(zhí)行一次,并且是在主線程中。
- (PHImageRequestID)requestImageDataForAsset:(PHAsset *)asset options:(nullable PHImageRequestOptions *)options resultHandler:(void(^)(NSData *__nullable imageData, NSString *__nullable dataUTI, UIImageOrientation orientation, NSDictionary *__nullable info))resultHandler;