如果看過了之前的三片文章牍白,其實(shí)會發(fā)現(xiàn)自始至終帕胆,除了有幾個和系統(tǒng)的交互會展示一張圖片外儒老,一張圖片都沒有看到囚衔,我們一直看到的只是一個數(shù)字或者簡單的信息。
如果一定要來做個比喻的話稳衬,前面介紹的都是準(zhǔn)備的子彈砰碴,現(xiàn)在缺少一個能使用子彈的槍,而且是沖鋒槍,而這個沖鋒槍就是PHImageManager辛萍。
通過PHImageManager我們可以獲取到確切的圖片并展示出來,其使用過程也很簡單传睹,針對Image邢隧、Live Photo纫谅、Video都有不同的方法相對應(yīng)询吴。
下面就簡單的看看Image相關(guān)的使用吧。
PHImageManager
注意??:該類下的size都是像素單位,并不是之前常用的點(diǎn)惩激。因?yàn)樘O果的不同手機(jī)的分辨率不同店煞,所以在得到像素之前,要先獲取比例风钻,使用方法[UIScreen mainScreen].scale
即可獲取到顷蟀,然后就可轉(zhuǎn)換為相應(yīng)的像素單位。
其使用步驟骡技,蘋果在其官方文檔中也做了如下說明:
1鸣个、使用PHAsset獲取到你想要的資源
2、使用類方法[PHImageManager defaultManager]
獲取到PHImageManager對象
3布朦、調(diào)用PHImageManager相關(guān)的方法獲取數(shù)據(jù)
上面的三步囤萤,最難的就是第三步,因?yàn)檫@里的每個方法的注意點(diǎn)都不一樣是趴。目前涛舍,就只是針對圖片的兩個方法做個簡單的介紹吧,其他的如果在后面有需求或者時間唆途,再做更新:
- (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ù)說明:
1富雅、asset:要展示的那個圖片的資源
2、targetSize:想要返回的圖片的尺寸窘哈,注意這里的單位是像素吹榴;另外,還有一個全局常量滚婉,用來表示圖片的原始尺寸或者盡可能大的尺寸:PHImageManagerMaximumSize图筹,使用該常量,會忽略參數(shù)contentMode让腹,它一般得到的是原圖
3远剩、contentMode:是個枚舉,有兩個值可供選擇:PHImageContentModeAspectFit(默認(rèn))
和PHImageContentModeAspectFill
其意義和UIImageView的contentMode是相通的骇窍,前者按比例放大瓜晤,直到有一邊到了邊界就不再放大,該模式下你會看到完整的圖片腹纳,但是有可能會有空白痢掠;后者按比例放大驱犹,直到兩條邊里的最后一對到達(dá)邊界,該模式下的到的圖片可能會存在有一對邊超出邊界的情況足画,造成圖片缺失雄驹。
4、options:用來定義一些屬性淹辞,其中最常用的屬性應(yīng)該是isSynchronous
医舆,該屬性定義了是異步執(zhí)行還是同步執(zhí)行,需要注意的是如果是同步執(zhí)行的話象缀,該請求是不能被停止的蔬将;另一個屬性是networkAccessAllowed
,表示是否允許從iCloud請求圖片央星。
需要注意的是霞怀,如果實(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州泊,或者說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可以看出,會在當(dāng)前線程異步執(zhí)行多次漂洋,除了最后一次會在主線程返回之外遥皂,其他的都在當(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;