iOS選取相簿中iCloud雲上圖片和視頻的處理

來源:互聯網
上載者:User

標籤:方案   bsp   導致   result   uiimage   可用記憶體   lin   src   pca   

關於iOS選取相簿中iCloud雲片和視頻 推薦看:TZImagePickerController的源碼,這個是一個非常靠譜的相簿選擇圖片視頻的庫 。當然也可以自己寫 如下遇到的問題

工作原因,需要處理接入一個視頻模組,在視頻選擇的時候遇到了一個不太容易發現的bug,產生的原因是由於手機記憶體小,而使用者又開啟了相簿同步iCloud,

 

載入中的圖片

 

在這時,如果本地可用記憶體過小,會導致
將本地相簿中的圖片或視頻刪除只留縮圖,如果App調用的時候想要選取這種圖片就需要從iCloud雲中進行下載,
才能擷取原圖或原視頻。

下面po下解決方案:

如果你之前處理過相簿問題,那麼對如下的代碼肯定不陌生,就是很普通的兩個系統層級的請求回調,擷取對應的圖片,視頻。

// get Image[[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {}];// get Video[[PHImageManager defaultManager] requestPlayerItemForVideo:asset options:nil resultHandler:^(AVPlayerItem * _Nullable playerItem, NSDictionary * _Nullable info) {    if (completion) completion(playerItem,info);}];

 

但是往往之前沒有注意到第二個輸入 options 是用來幹嘛的,
其實解決方案就來自於這個 PHImageRequestOptionsPHVideoRequestOptions

這這兩個 options 都有一個共同的參數就是

@property (nonatomic, assign, getter=isNetworkAccessAllowed) BOOL networkAccessAllowed;// if necessary will download the image from iCloud (client can monitor or cancel using progressHandler). Defaults to NO (see start/stopCachingImagesForAssets)

 

系統的解釋也很詳細,如果賦值 YES ,那麼允許從 iCloud 中擷取圖片和視頻,預設是 NO

雖然這個問題解決不是很難,但是往往容易被忽略,所以記錄一下。

這裡非常感謝@半遲塵大大的TZImagePickerController的源碼,這個是一個非常靠譜的相簿選擇圖片視頻的庫,並且處於仍在維護中。感興趣的可以連結過去看一看源碼,寫的很好。

博主部落格@HarwordLiu

下面po一下完整的這個問題的解決代碼:

/// Get Video- (void)getVideoOutputPathWithAsset:(PHAsset *)asset completion:(void (^)(NSString *outputPath))completion {    PHVideoRequestOptions* options = [[PHVideoRequestOptions alloc] init];    options.version = PHVideoRequestOptionsVersionOriginal;    options.deliveryMode = PHVideoRequestOptionsDeliveryModeAutomatic;    options.networkAccessAllowed = YES;    [[PHImageManager defaultManager] requestAVAssetForVideo:asset options:options resultHandler:^(AVAsset* avasset, AVAudioMix* audioMix, NSDictionary* info){        // NSLog(@"Info:\n%@",info);        AVURLAsset *videoAsset = (AVURLAsset*)avasset;        // NSLog(@"AVAsset URL: %@",myAsset.URL);        [self startExportVideoWithVideoAsset:videoAsset completion:completion];     }];}/// Get Image- (PHImageRequestID)getPhotoWithAsset:(PHAsset *)asset photoWidth:(CGFloat)photoWidth completion:(void (^)(UIImage *, NSDictionary *, BOOL isDegraded))completion {    PHAsset *phAsset = (PHAsset *)asset;    CGFloat aspectRatio = phAsset.pixelWidth / (CGFloat)phAsset.pixelHeight;    CGFloat pixelWidth = photoWidth * 2.0;    CGFloat pixelHeight = pixelWidth / aspectRatio;    CGSize imageSize = CGSizeMake(pixelWidth, pixelHeight);    // 修複擷取圖片時出現的瞬間記憶體過高問題    PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];    option.resizeMode = PHImageRequestOptionsResizeModeFast;    PHImageRequestID imageRequestID = [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:imageSize contentMode:PHImageContentModeAspectFill options:option resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {        BOOL downloadFinined = (![[info objectForKey:PHImageCancelledKey] boolValue] && ![info objectForKey:PHImageErrorKey]);        if (downloadFinined && result) {            if (completion) completion(result,info,[[info objectForKey:PHImageResultIsDegradedKey] boolValue]);        }        // Download image from iCloud / 從iCloud下載圖片        if ([info objectForKey:PHImageResultIsInCloudKey] && !result) {            PHImageRequestOptions *option = [[PHImageRequestOptions alloc]init];            option.networkAccessAllowed = YES;            option.resizeMode = PHImageRequestOptionsResizeModeFast;            [[PHImageManager defaultManager] requestImageDataForAsset:asset options:option resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {                UIImage *resultImage = [UIImage imageWithData:imageData scale:0.1];                if (completion) completion(resultImage,info,[[info objectForKey:PHImageResultIsDegradedKey] boolValue]);            }];        }    }];    return imageRequestID;}

 

 

iOS選取相簿中iCloud雲片和視頻的處理

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.