iOS 8??獲取用戶最新一張圖片

iOS 8以上獲取最新一張圖片可以使用系統(tǒng)框架<Photos> 提供的API來完成。

項目里面即時通訊功能,需要做一個用戶點擊“+”號顯示用戶最近存入的一張圖片,類似微信、QQ、支付寶聊天界面那樣。

需要考慮的問題如下:

1. 權(quán)限問題:

  • 應該先獲取到用戶對相冊的權(quán)限,僅在status == PHAuthorizationStatusAuthorized 情況下去獲取

2. 時間間隔對比

  • 與手機當前時間對比,超過10秒的不獲取

3. 用戶相冊加入新圖片問題

  • 用戶每次點擊“+”時,調(diào)用方法獲取一次最新圖片

4. 顯示了一遍之后不再顯示,如果此時有新圖片加入,需要顯示最新的那張

  • 當用戶未選擇操作獲取的那張圖片,則不再顯示這張圖片;當再次點擊“+”號時,還需要再次獲取10秒內(nèi)的一張圖片,與剛剛未選擇使用的圖片進行對比.

  • 圖片對比的方式推薦使用存儲圖片的時間戳方式,由于退出此APP時再次進入時仍然要能記住上次獲取到的圖片時間戳,所以建議存儲在NSUserDefaults
    對一張圖片10s內(nèi)兩次獲取,雖然是同一張圖片,系統(tǒng)回調(diào)的圖片結(jié)果地址不一致。 閱讀了相關(guān)博客也不建議用回調(diào)的info里面字段作判斷, 所以這里采用的圖片的時間戳

下面是圖片獲取的具體代碼
static NSTimeInterval const latestAssetFetchInterval = 10;

@interface AJUserPhotoFetchManager ()

@property (nonatomic, strong, nullable) NSDate *lastAssetcreationDate;
@end

static NSString * const kLastAssetcreationDateKey = @"kLastAssetcreationDateKey";
@implementation AJUserPhotoFetchManager

#pragma mark - 單例方法
static AJUserPhotoFetchManager *sharedInstance;
+ (id)allocWithZone:(struct _NSZone *)zone
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [super allocWithZone:zone];
        sharedInstance.lastAssetcreationDate = [[NSUserDefaults standardUserDefaults] objectForKey:kLastAssetcreationDateKey];
    });
    
    return sharedInstance;
}

+ (AJUserPhotoFetchManager *)sharedUserPhotoFetchManager
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[AJUserPhotoFetchManager alloc]init];
        sharedInstance.lastAssetcreationDate = [[NSUserDefaults standardUserDefaults] objectForKey:kLastAssetcreationDateKey];
    });
    return sharedInstance;
}


/** 點擊“+”號的時候獲取相冊列表,獲取最新保存的一張圖片。
  * 根據(jù)圖片保存時間,與當前時間戳進行計算,獲得間隔時間。從而判斷是否是需求的時間間隔。(時間間隔自定義)
 */
- (void)fetchLatestPhotoInTimeIntervalWithCompletion:(void (^)(UIImage *result, NSDictionary *info))completion{
    // 此處不能主動獲取權(quán)限,在用戶同意的情況下可以去獲取
    PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
    if (status == PHAuthorizationStatusAuthorized) {
        
//        AJUserPhotoFetchManager *sharedUserPhotoFetchManager = [AJUserPhotoFetchManager sharedUserPhotoFetchManager];
        PHAsset *latestAsset = [self fetchLatestPhotoAsset];
        NSDate *nowDate = [NSDate date];
        NSTimeInterval timeInterval = [nowDate timeIntervalSinceDate:latestAsset.creationDate];// 創(chuàng)建時間距離的時間間隔
        if (timeInterval > latestAssetFetchInterval) { // 超出時間了
            return;
        }
        // 對一張圖片10s內(nèi)兩次獲取,雖然是同一張圖片,系統(tǒng)回調(diào)的圖片結(jié)果地址不一致。 
        // 閱讀了相關(guān)博客也不建議用回調(diào)的info里面字段作判斷, 所以這里采用的圖片的時間戳
        if (self.lastAssetcreationDate && [self.lastAssetcreationDate compare:latestAsset.creationDate] != NSOrderedAscending) { // 上次已經(jīng)獲取過了
            return;
        }
        
        PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
        options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
        
        [[PHImageManager defaultManager] requestImageForAsset:latestAsset targetSize:UIScreen.mainScreen.bounds.size contentMode:PHImageContentModeAspectFit options:options resultHandler:^(UIImage *result, NSDictionary *info) {
            self.lastAssetcreationDate = latestAsset.creationDate;
            [[NSUserDefaults standardUserDefaults] setObject:latestAsset.creationDate forKey:kLastAssetcreationDateKey];
            completion(result, info);
        }];
    }
}

- (PHAsset *)fetchLatestPhotoAsset{

    PHFetchOptions *options = [[PHFetchOptions alloc]init];
    if (@available(iOS 9.0, *)) {
        options.fetchLimit = 1;
    }
    options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]];
    PHFetchResult *assetsFetchResults = [PHAsset fetchAssetsWithOptions:options];
    return assetsFetchResults.firstObject;
}

+ (void)requestAuthorization:(void (^)(PHAuthorizationStatus))handler{
    [PHPhotoLibrary requestAuthorization:handler];
}

完結(jié)。

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

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,041評論 4 61
  • 點擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 14,282評論 0 15
  • 在黏土娃娃的眼里,他的媽媽是世界上最完美的媽媽,不但會給他做好吃的,每天還會陪著他一起學習,他最喜歡自己的...
    流光69碎影閱讀 724評論 2 7
  • 法國符號學家羅蘭?巴爾特在他的學術(shù)名著《符號學歷險》中這樣說廣告:“商業(yè)動機不是被掩飾,而是被一種大得多的再現(xiàn)作用...
    全哥讀書閱讀 378評論 0 0
  • 很多個這樣的夜晚,我都在和回憶抗衡。冬天,猶是。 曾經(jīng),很長一段時間裡,我的世界是灰色的,猶如陰雲(yún)密布卻等不來雨時...
    陌初寒殤殘風涼城閱讀 306評論 0 0

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