簡體   English   中英

帶有URLSession的Swift iOS -DispatchGroup鎖定了未位於其中的應用程序的其他部分

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM