[英]Swift iOS -DispatchGroup with URLSession is locking other parts of app that it is not located in
我有最多6張圖片的陣列。 我使用循環遍歷所有圖像,將它們轉換為元數據,將元數據發送到存儲,然后在完成后將url字符串發送到Firebase數據庫。
當Url更改為Data時,我正在使用DispatchGroup來控制循環,因此可以將數據發送到Firebase Storage。
如果在tabOne中發生此循環,如果我來回切換至tabTwo或tabThree,則在循環結束並顯示警報時,tabTwo被臨時鎖定,或者tabThree被臨時鎖定約2-3秒。 我無法弄清楚哪里出了問題?
我不確定是否會有所不同,但我使用的是自定義提醒,而不是UIAlertController。 它只是一些UIViews和一個按鈕,沒什么特別的,所以我沒有包含代碼。
var urls = [URL]()
picUUID = UUID().uuidString
dict = [String:Any]()
let myGroup = DispatchGroup()
var count = 0
for url in urls{
myGroup.enter() // enter group here
URLSession.shared.dataTask(with: url!, completionHandler: {
(data, response, error) in
guard let data = data, let _ = error else { return }
DispatchQueue.main.async{
self.sendDataToStorage("\(self.picUUID)_\(self.count).jpg", picData: data)
self.count += 1
}
}).resume()
// send dictionary data to firebase when loop is done
myGroup.notify(queue: .main) {
self.sendDataToFirebaseDatabase()
self.count = 0
}
}
func sendDataToStorage(_ picId: String, picData: Data?){
dict.updateValue(picId, forKey:"picId_\(count)")
let picRef = storageRoot.child("pics")
picRef.putData(picData!, metadata: nil, completion: { (metadata, error) in
if let picUrl = metadata?.downloadURL()?.absoluteString{
self.dict.updateValue(picUrl, forKey:"picUrl_\(count)")
self.myGroup.leave() // leave group here
}else{
self.myGroup.leave() // leave group if picUrl is nil
}
}
}
func sendDataToFirebaseDatabase(){
let ref = dbRoot.child("myRef")
ref.updateChildValues(dict, withCompletionBlock: { (error, ref) in
displaySuccessAlert()
}
}
我對Firebase不太了解,但是您正在將sendDataToFirebaseDatabase
方法調度到主隊列,這可能解釋了UI變得無響應的原因。
將sendDataToFirebaseDatabase
到后台隊列,僅將displaySuccessAlert
分配回主隊列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.