我的應用程式作為從應用程式主螢屏中選擇多個影像的功能,并將所選影像保存到用戶圖庫。
舉個例子(圖片來自谷歌):

用戶單擊“保存”后,我正在執行以下操作以將所選影像保存到用戶的圖庫。
- 遍歷所有影像并保存單擊的每個影像。
func saveSelectedImagesToDevice() {
for imageList in imagesListCells {
for image in imageList.images {
if image.selectionState == .onClicked {
downloadImage(from: image.url)
}
}
}
}
- 下載每個影像
func downloadImage(from url: String) {
guard let url = URL(string: url) else {return}
getData(from: url) { data, response, error in
guard let data = data, error == nil else { return }
guard let image = UIImage(data: data) else {return}
UIImageWriteToSavedPhotosAlbum(image, self, #selector(self.image(_:didFinishSavingWithError:contextInfo:)), nil)
}
}
private func getData(from url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> ()) {
URLSession.shared.dataTask(with: url, completionHandler: completion).resume()
}
@objc func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {
if let _ = error {
self.delegate?.savedImage(proccessMsg: "Error adding images to the gallery, pleast make sure you enabled photos permissions in phone setting")
}
}
問題是,因為保存程序是異步的,如果在下載影像的程序中發生錯誤,我想停止在后臺運行的所有其他異步行程。
目前,如果出現錯誤,每個影像都會呼叫錯誤。
任何想法如何管理它以保持行程異步但能夠在出現錯誤時停止所有行程?
uj5u.com熱心網友回復:
您必須完全更改下載的架構以使其可取消。資料任務是可以取消的,但你的不是因為你沒有保留任何參考它的方式。
uj5u.com熱心網友回復:
如果您想創建多個會話,Apple 建議不要使用共享實體。您可以嘗試通過創建單個會話實體并在收到錯誤后立即使其無效來實作此目的。請記住,如果您想重新啟動會話,則需要重新實體化一個新會話。
例如
let session = URLSession(configuration: .default)
func downloadImage(from url: String) {
guard let url = URL(string: url) else {return}
session.dataTask(with: url) { [weak self] data, response, error in
guard let self = self else { return }
if let error = error {
print("You have an error: ",error.localizedDescription)
self.session.invalidateAndCancel()
}else if let data = data,
let image = UIImage(data: data) {
UIImageWriteToSavedPhotosAlbum(image, self, #selector(self.image(_:didFinishSavingWithError:contextInfo:)), nil)
}
}.resume()
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/322515.html
上一篇:通知中心收不到通知
