PHImageManager

如果看過(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");
    });
image.png

這種情況下,打印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");
    });
image.png

打印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");
    });
image.png

從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;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 父類:NSObject 提供獲取或生成預(yù)覽縮略圖和全尺寸圖片,或者視頻數(shù)據(jù)的方法。 一、概述 使用這些方法來(lái)獲取全...
    Shmily落墨閱讀 10,676評(píng)論 5 6
  • 一、 PhotoKit的變量: PHAdjustmentData: When a user edits an as...
    漓汐Arthur閱讀 1,873評(píng)論 1 3
  • 本文轉(zhuǎn)載自Kayo Lee發(fā)表的文章,本文鏈接:http://kayosite.com/ios-developme...
    JackyHeWei閱讀 10,728評(píng)論 10 10
  • 《七絕·緬運(yùn)生》(新韻) 溫志齡 酷嗜吟哦筆未沉,籌謀雅社建奇勛。 黃泉路上當(dāng)舒慰,...
    碧野牧歌閱讀 224評(píng)論 2 3
  • 下午看到朋友圈裡,小甜妹發(fā)了一條感慨:今天打了一天滴滴,真方便!以後可以不用開(kāi)車上班了。 我接著回覆說(shuō):用優(yōu)步更便...
    林素兮閱讀 340評(píng)論 11 4

友情鏈接更多精彩內(nèi)容