2017-09-23 26 views
7

Sau khi cập nhật lên iOS 11, tài sản ảnh tại tải chậm và tôi nhận được tin nhắn này trong giao diện điều khiển:iOS 11: [ImageManager] Không thể tải dữ liệu hình ảnh

[ImageManager] Không thể tải dữ liệu hình ảnh, /var/mobile/Media/DCIM/103APPLE/IMG_3064.JPG

tôi sử dụng chức năng tĩnh để tải hình ảnh:

class func getAssetImage(asset: PHAsset, size: CGSize = CGSize.zero) -> UIImage? { 
    let manager = PHImageManager.default() 
    let option = PHImageRequestOptions() 
    option.isSynchronous = true 

    var assetImage: UIImage! 
    var scaleSize = size 
    if size == CGSize.zero { 
     scaleSize = CGSize(width: asset.pixelWidth, height: asset.pixelHeight) 
    } 

    manager.requestImage(for: asset, targetSize: scaleSize, contentMode: .aspectFit, options: option) { (image, nil) in 
     if let image = image { 
      assetImage = image 
     } 
    } 
    if assetImage == nil { 
     manager.requestImageData(for: asset, options: option, resultHandler: { (data, _, orientation, _) in 
      if let data = data { 
       if let image = UIImage.init(data: data) { 
        assetImage = image 
       } 
      } 
     }) 
    } 
    return assetImage 
} 

Yêu cầu hình ảnh cho tài sản thường luôn luôn thành công, nhưng nó in thông điệp này. Nếu tôi chỉ sử dụng chức năng requestImageData, không có thông báo như vậy, nhưng ảnh được chụp bằng máy ảnh Apple mất định hướng và tôi gặp nhiều vấn đề hơn trong khi tải số lượng lớn ảnh (tôi sử dụng trình chiếu hình ảnh trong ứng dụng của mình).

Apple luôn luôn hút khi nói đến bản cập nhật, có thể ai đó đã có giải pháp khắc phục sự cố này? Nó thậm chí không tải một tài sản, khi có một danh sách lớn của chúng trong máy ảnh của người dùng. Chuyển sang requestImageData không phải là một tùy chọn cho tôi vì nó mang đến dữ liệu nil thường xuyên ngay bây giờ.

Tôi muốn chỉ ra rằng tôi chỉ gọi hàm này một lần. Nó không được sử dụng trong UITableView vv .. Tôi sử dụng mã khác cho ngón tay cái với người quản lý khởi tạo trên toàn cầu và các tùy chọn, vì vậy tài sản chắc chắn không phải là số 0. Khi bộ sưu tập có 5000 ảnh, có thể kết nối với nội dung chỉ bị quá tải và sau đó nó không thể xử lý yêu cầu và sự cố? Rất nhiều câu hỏi.

+0

Tôi thấy vấn đề tương tự kể từ khi nâng cấp lên iOS 11. Nếu tôi yêu cầu kích thước đủ nhỏ (256 x 256) cho hình thu nhỏ, tất cả đều tải. Khi tôi sử dụng cùng một mã cho kích thước lớn hơn nó không thành công khoảng 20%. Chưa tìm ra bất kỳ mẫu nào. – user1055568

+0

Bạn có tìm thấy bản sửa lỗi cho điều này không? – kye

+0

Không thực sự, cảnh báo vẫn còn dai dẳng. –

Trả lời

-2

Điều này có vẻ là một lỗi với iOS 11, nhưng tôi thấy tôi có thể làm việc xung quanh bằng cách đặt tùy chọn đồng bộ sai. Tôi đã làm lại mã của mình để xử lý việc phân phối không đồng bộ. Có lẽ bạn có thể sử dụng đồng bộ (thực hiện :) để sửa chữa nhanh chóng.

Ngoài ra, tôi tin rằng sự cố chỉ xảy ra với ảnh được phân phối bởi chia sẻ iCloud.

+2

Nó không làm việc cho tôi. Tuy nhiên, có vẻ như việc tối ưu hóa các cuộc gọi tới khung Ảnh sẽ tăng hiệu suất tổng thể. Bây giờ tôi lấy tài sản OperationQueue và sau đó tôi đặt chúng không đồng bộ trên các mục UI. Tôi đã tắt các ảnh mạng, vì vậy chúng chắc chắn không có trong iCloud và đồng bộ/async hoạt động khá giống với tôi. Dường như đó là một lỗi iOS khác, giờ đây tài sản hoạt động chậm hơn nhiều so với trước đây. –

+0

Tôi tin rằng async đã không làm việc cho tôi lúc đầu, hoặc, mặc dù tôi không thể nhớ những gì tôi đã thay đổi để làm cho nó hoạt động. Điều gì đang làm việc bây giờ là thiết lập deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic, contentMode PHImageContentModeAspectFill. Thông điệp tường trình sẽ vẫn xuất hiện nhưng hình ảnh kích thước đầy đủ cuối cùng cũng đến. – user1055568

0

Bạn có thể thử phương thức "requestImageData" với các tùy chọn sau. Điều này làm việc cho tôi trong iOS 11.2 (cả trên thiết bị và giả lập).

let options = PHImageRequestOptions() 
options.deliveryMode = .highQualityFormat 
options.resizeMode = .exact 
options.isSynchronous = true 

PHImageManager.default().requestImageData(for: asset, options: options, resultHandler: { (data, dataUTI, orientation, info) in 
Các vấn đề liên quan