2015-01-27 23 views
18

Tôi đang sử dụng khung ảnh trên iOS8.1 và yêu cầu dữ liệu hình ảnh cho nội dung bằng cách sử dụng requestImageDataForAsset ... Hầu hết thời gian hoạt động và tôi nhận được dữ liệu hình ảnh và từ điển chứa những gì bạn xem bên dưới. Nhưng đôi khi cuộc gọi hoàn tất, nhưng dữ liệu là nil và từ điển chứa ba mục tìm kiếm chung.Ảnh Khung yêu cầuImageDataForAsset thỉnh thoảng không thành công

Các cuộc gọi được thực hiện tuần tự và trên cùng một chuỗi. Nó không phải là cụ thể cho bất kỳ hình ảnh cụ thể. Lỗi sẽ xảy ra trên các hình ảnh tôi đã mở thành công trong quá khứ. Có ai gặp phải điều này không?

+ (NSData *)retrieveAssetDataPhotosFramework:(NSURL *)urlMedia resolution:(CGFloat)resolution imageOrientation:(ALAssetOrientation*)imageOrientation { 

    __block NSData *iData = nil; 

    PHFetchResult *result = [PHAsset fetchAssetsWithALAssetURLs:@[urlMedia] options:nil]; 
    PHAsset *asset = [result firstObject]; 

    PHImageManager *imageManager = [PHImageManager defaultManager]; 
    PHImageRequestOptions *options = [[PHImageRequestOptions alloc]init]; 
    options.synchronous = YES; 
    options.version = PHImageRequestOptionsVersionCurrent; 

    @autoreleasepool { 
     [imageManager requestImageDataForAsset:asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { 
      iData = [imageData copy]; 
      NSLog(@"requestImageDataForAsset returned info(%@)", info); 
      *imageOrientation = (ALAssetOrientation)orientation; 
     }]; 
    } 

    assert(iData.length != 0); 
    return iData; 
} 

Đây là kết quả mong muốn mà tôi nhận được dữ liệu hình ảnh và từ điển dữ liệu meta:

requestImageDataForAsset returned info({ 
    PHImageFileDataKey = <PLXPCShMemData: 0x1702214a0> bufferLength=1753088 dataLength=1749524; 
    PHImageFileOrientationKey = 1; 
    PHImageFileSandboxExtensionTokenKey = "6e14948c4d0019fbb4d14cc5e021199f724f0323;00000000;00000000;000000000000001a;com.apple.app-sandbox.read;00000001;01000003;000000000009da80;/private/var/mobile/Media/DCIM/107APPLE/IMG_7258.JPG"; 
    PHImageFileURLKey = "file:///var/mobile/Media/DCIM/107APPLE/IMG_7258.JPG"; 
    PHImageFileUTIKey = "public.jpeg"; 
    PHImageResultDeliveredImageFormatKey = 9999; 
    PHImageResultIsDegradedKey = 0; 
    PHImageResultIsInCloudKey = 0; 
    PHImageResultIsPlaceholderKey = 0; 
    PHImageResultWantedImageFormatKey = 9999; 
}) 

Đây là những gì tôi nhận được thường xuyên. dữ liệu hình ảnh là không. Từ điển không chứa quá nhiều.

requestImageDataForAsset returned info({ 
    PHImageResultDeliveredImageFormatKey = 9999; 
    PHImageResultIsDegradedKey = 0; 
    PHImageResultWantedImageFormatKey = 9999; 
}) 
+0

Điều này cũng xảy ra với tôi, đối với hình ảnh trong luồng iCloud được chia sẻ. Chưa có giải pháp nào. – an0

+0

Điều này dường như xảy ra thường xuyên (gần 100%) khi cố gắng sử dụng tùy chọn.synchronous = YES để tìm nạp hình ảnh cho nội dung trong luồng ảnh iCloud (a.k.a., Album được chia sẻ) chưa được tải xuống. Nếu hình ảnh đã được tải xuống và lưu vào bộ nhớ cache bởi ứng dụng Ảnh hoặc ứng dụng của tôi không đồng bộ, nó sẽ hoạt động tốt. Nếu không, tải xuống đồng bộ luôn không thành công. Tôi đã thử iOS 8.x, 9.0 và 9.1 với cùng kết quả. – LenK

+0

Tôi cũng gặp sự cố này. Cách giải quyết của tôi là đặt tùy chọn.synchronous = NO –

Trả lời

3

Bạn có khả năng lặp qua một mảng và bộ nhớ không được giải phóng kịp thời, bạn có thể thử mã bên dưới. Đảm bảo theData được đánh dấu bằng __block.

@autoreleasepool { 
    [imageManager requestImageDataForAsset:asset options:options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) { 
     NSLog(@"requestImageDataForAsset returned info(%@)", info); 
     theData = [imageData copy]; 
    }]; 
} 
+0

Cảm ơn gabbler. @The autoreleasepool không giúp giảm thiểu việc sử dụng bộ nhớ dưới tải (truy xuất nhiều hình ảnh liên tiếp), nhưng vấn đề vẫn tồn tại. –

+0

Đăng mã truy xuất nhiều hình ảnh liên tiếp. – gabbler

+0

Tôi đã cập nhật bài đăng để hiển thị toàn bộ phương thức. Tôi đã bọc requestImageDataForAsset trong một phương thức lớp để bảo vệ người gọi khỏi sự quan tâm đến phiên bản iOS. Có một phương pháp tương tự cho ALAssetsLibrary được gọi trên iOS7. Mã không được gọi trong vòng lặp, thay vì nhiều sự kiện có thể xảy ra khi các hình ảnh khác nhau được yêu cầu cùng một lúc. Sự cố không nhất quán. Nó đã không xảy ra ở tất cả trong ngày hôm qua. Đôi khi nó xảy ra ở đây và ở đó. Đôi khi nó xảy ra 50% thời gian một bức ảnh được yêu cầu. –

0

Quay lại vấn đề này sau một thời gian dài, tôi đã giải quyết được một phần lớn vấn đề của mình. Không bí ẩn, chỉ là mã xấu:

PHFetchResult *result = [PHAsset fetchAssetsWithALAssetURLs:@[urlMedia] options:nil]; 
PHAsset *asset = [result firstObject]; 

if (asset != nil) { // the fix 
    PHImageManager *imageManager = [PHImageManager defaultManager]; 
    PHImageRequestOptions *options = [[PHImageRequestOptions alloc]init]; 
    ... 
} 

Nguyên nhân phổ biến nhất đối với tôi là một vấn đề với URL phương tiện truyền thông truyền cho fetchAssetsWithALAssetURLs gây tài sản là con số không và requestImageDataForAsset trả về một đối tượng thông tin mặc định.

+0

Bạn có giải quyết được vấn đề của mình hoàn toàn bằng cách 'không' nhận tài sản không? – WYS

1

Tôi đã có một vấn đề với các triệu chứng tương tự như nơi requestImageDataForAsset trở dữ liệu hình ảnh bằng không mà còn được kèm theo một thông điệp điều khiển lỗi như thế này:

[Generic] Failed to load image data for asset <PHAsset: 0x13d041940> 87CCAFDC-A0E3-4AC9-AD1C-3F57B897A52E/L0/001 mediaType=1/0, sourceType=2, (113x124), creationDate=2015-06-29 04:56:34 +0000, location=0, hidden=0, favorite=0 with format 9999

Trong trường hợp của tôi, vấn đề đột nhiên bắt đầu xảy ra trên một cụ thể chỉ thiết bị có nội dung trong album được chia sẻ iCloud sau khi nâng cấp từ iOS 10.x lên 11.0.3 và từ đó đến 11.2.5. Suy nghĩ rằng có thể requestImageDataForAsset đang cố gắng sử dụng các tệp cục bộ được lưu trong bộ nhớ cache trong /var/mobile/Media/PhotoData/PhotoCloudSharingData/ (từ khóa PHImageFileURLKey của từ điển thông tin) và bộ nhớ cache có thể bị hỏng Tôi đã nghĩ về cách xóa bộ nhớ cache đó.

Toggling nút 'Chia sẻ ảnh iCloud' trong iOS 'Cài đặt -> Tài khoản & Mật khẩu -> iCloud -> Ảnh dường như đã thực hiện thủ thuật. requestImageDataForAsset hiện đang hoạt động đối với những nội dung không thành công trước đó.

Cập nhật ngày 09 tháng 3 năm 2018

tôi có thể tái tạo vấn đề này ngay bây giờ. Dường như nó xảy ra sau khi khôi phục bản sao lưu từ iTunes:

  1. Sử dụng ứng dụng iOS và truy xuất ảnh từ album được chia sẻ iCloud.
  2. Sao lưu thiết bị iOS bằng iTunes.
  3. Khôi phục bản sao lưu bằng iTunes.
  4. Sử dụng lại ứng dụng để truy xuất cùng một ảnh từ album được chia sẻ iCloud hiện không thành công với thông báo trên bảng điều khiển.

Toggling nút 'Chia sẻ ảnh iCloud' sẽ khắc phục sự cố. Có lẽ quá trình khôi phục bằng cách nào đó làm hỏng một số bộ nhớ cache. Tôi đã báo cáo nó là Bug 38290463 cho Apple.

+0

Nhưng làm thế nào để bạn yêu cầu người dùng làm như vậy? Sẽ là tuyệt vời để có một giải pháp cho chính ứng dụng đó. – d4Rk

+0

@ d4Rk Đó là một điểm tốt. Để ứng dụng phát hiện chính xác tình huống này và sau đó có thể hướng người dùng đến trang hỗ trợ mô tả những gì cần khắc phục vấn đề sẽ là lý tưởng. Phát hiện chính xác vấn đề có thể phức tạp vì tất cả những gì bạn thực sự có từ bên trong ứng dụng là kết quả không có, không có thông tin khác để phân biệt giữa các nguyên nhân lỗi khác có thể xảy ra. – user2067021

Các vấn đề liên quan