Как поделиться UIImage с Camera Roll с помощью UIActivityViewController

Я написал этот код, чтобы поделиться UIImage

guard let codeImage = imgQRCode.image else {
        return
    }
    PHPhotoLibrary.requestAuthorization({status in
        if status == .authorized {
            let ac = UIActivityViewController(activityItems: [codeImage], applicationActivities: nil)
            self.present(ac, animated: true, completion: nil)
        } else {
            self.showOkAlert(messageTitle: "Access not granted", messageText: "Code image not saved.", okText: "OK", {})
        }
    })
}

Доступ к библиотеке фотографий предоставлен, но приложение вылетает с этим отчетом в журнале:

2019-08-15 20:25:01.395163+0200 ContactQR[1689:281884] [Animation] +[UIView setAnimationsEnabled:] вызывается из фонового потока. Выполнение любой операции из фонового потока в UIView или подклассе не поддерживается и может привести к неожиданному и коварному поведению.

Что не так в коде?


person Dawy    schedule 15.08.2019    source источник


Ответы (1)


Из документации для PHPhotoLibrary requestAuthorization:

Фотографии могут вызывать ваш блок обработчика в произвольной последовательной очереди. Если вашему обработчику необходимо взаимодействовать с элементами пользовательского интерфейса, отправьте такую ​​работу в основную очередь.

Поэтому вам нужно добавить использование DispatchQueue.main.async:

PHPhotoLibrary.requestAuthorization({status in
    DispatchQueue.main.async {
        if status == .authorized {
            let ac = UIActivityViewController(activityItems: [codeImage], applicationActivities: nil)
            self.present(ac, animated: true, completion: nil)
        } else {
            self.showOkAlert(messageTitle: "Access not granted", messageText: "Code image not saved.", okText: "OK", {})
        }
    }
})

person rmaddy    schedule 15.08.2019
comment
Ошибка исчезла, но изображение не сохраняется, если оно взято из imgQRCode UIImageView, но если я использую вместо него let codeImage = UIImage(named: Ghost), то это работает. - person Dawy; 15.08.2019
comment
Вы должны опубликовать новый вопрос, относящийся к вашей новой проблеме, со всеми соответствующими подробностями, если вы не можете понять это самостоятельно. - person rmaddy; 15.08.2019