Получение "JPEGDecompressSurface: сбой декодирования изображения": при создании UIImage из исходных данных JPG на iOS 10

Начиная с обновления до iOS 10, я получаю следующую ошибку при создании UIImage из NSMutableData:

JPEGDecompressSurface: сбой декодирования изображения: e000..... "

В результате не возникает странное или не нормальное поведение, но когда я отлаживаю приложение, я вижу ошибку при каждом создании образа.

Вот код, где я создаю изображение из загруженных данных с помощью GCDAsynchSocket class:

NSData *imgDataToGen = [NSData dataWithData:imgBuffer];
UIImage *img = [[UIImage alloc] initWithData:imgDataToGen];
[_delegate client:self didReceiveImage:img];

Буфер imgBuffer - это NSMutableData-Object, который содержит данные загруженного изображения. Когда загрузка завершена, данные преобразуются в изображение и передаются в основной графический интерфейс, запуская пользовательский метод делегирования. В главном графическом интерфейсе изображение устанавливается на изображение. После обработки изображения буфер очищается.

Я пробовал разные вещи, например, заставляя расшифровку UIImage уже в фоновом потоке, но всегда получаю ту же ошибку. Изображение отображается всегда в правильном направлении, поэтому я действительно не понимаю сообщение об ошибке.

Я пробовал iPhone 5c с iOS 10.0.2 и на Simulator 5s с помощью iOS 9.2 и 10.0.2.

Вкл iPhone 5c Я получаю ошибку, на симуляторе нет.

Как я могу исправить эту ошибку или игнорировать этот тип ошибок?

Ответ 1

У меня была такая же проблема и решена. В моем случае я не заметил, но преобразование из Data в UIImage и сохранение было выполнено в основном потоке, как только я отправил его async в глобальную очередь с приоритетом QOS фона и только обновление GUI UIImage, которое я отправил обратно в главную очередь, ошибка остановки отображается в отладчике. Надеюсь, это поможет вам.

Пример:

fileprivate func downloadFromURL(urlString:String, callback:((_ image:UIImage?, _ error: Error?)->Void)?)   {
    var image: UIImage?
    guard let url = URL(string: urlString) else {
        callback!(nil, iError.RuntimeError(reason: "Wrong URL for image".localized))
        return
    }
    DispatchQueue.global(qos: .background).async {
        do {
            let data = try Data(contentsOf: url)
            image = UIImage(data: data)
            DispatchQueue.main.async {
                callback!(image,nil)
                return
            }

        } catch {
            print(error.localizedDescription)
            callback!(nil, iError.RuntimeError(reason: "Data error for image".localized))
            return

        }
    }
}