簡體   English   中英

使用Swift 3中的DispatchGroup()執行任務?

[英]Using DispatchGroup() in Swift 3 to perform a task?

使用Swift 3,使用GCD已經改為DispatchGroup() ,我正在嘗試學習在我的代碼中使用它。

目前我在另一個類中有一個函數,它試圖下載文件並輸出其速度。 我希望首先完成該功能,因為我將其速度分配給我將在第一個類中使用的var ,以執行依賴於該var其他任務。

它是這樣的:

二等:

func checkSpeed()
{
    // call other functions and perform task to download file from link

    // print out speed of download

    nMbps = speedOfDownload
}

頭等艙:

let myGroup = DispatchGroup()
let check: SecondClass = SecondClass()

myGroup.enter()

check.checkSpeed()

myGroup.leave()

myGroup.notify(queue: DispatchQueue.main, execute: {

    print("Finished all requests.")

    print("speed = \(check.nMbps)")
})

問題是Finish all requests首先輸出,因此返回nilspeed ,然后checkSpeed完成並輸出正確的下載速度。

我相信我做錯了,但我不確定?

在第一堂課中checkSpeed完成后,如何確保speed獲得正確的值?

checkSpeed的細節connectedToNetwork GitHub: connectedness.swift中checkSpeed完全相同

輸入的任務完成后,您需要調用DispatchGroup.leave() 因此,在您的代碼中, myGroup.leave()需要放在checkSpeed()方法內的完成處理程序的checkSpeed()

您可能需要像這樣修改代碼:

func checkSpeed(in myGroup: DispatchGroup) {
    //...
    ...downLoadTask... {...its completion handler... in
        //...

        // print out speed of download

        nMbps = speedOfDownload

        myGroup.leave() //<- This needs to be placed at the end of the completion handler
    }
    //You should not place any code after invoking asynchronous task.
}

並將其用作:

myGroup.enter()

check.checkSpeed(in: myGroup)

myGroup.notify(queue: DispatchQueue.main, execute: {

    print("Finished all requests.")

    print("speed = \(check.nMbps)")
})

但是,正如vadian的評論或Pangu的回答所指出的,您通常不會將DispatchGroup用於單個異步任務。


加成

我需要說,我強烈建議在盤古的答案中顯示完成處理程序模式 這是處理異步任務的更通用方法。

如果你已經按照建議將checkSpeed()修改為checkSpeed(completion:) ,你可以像這樣輕松地試驗DispatchGroup

let myGroup = DispatchGroup()
let check: SecondClass = SecondClass()
let anotherTask: ThirdClass = ThirdClass()

myGroup.enter() //for `checkSpeed`
myGroup.enter() //for `doAnotherAsync`

check.checkSpeed {
    myGroup.leave()
}
anotherTask.doAnotherAsync {
    myGroup.leave()
}

myGroup.notify(queue: DispatchQueue.main) {

    print("Finished all requests.")

    print("speed = \(check.nMbps)")
}

在這里的評論和解決方案中提供了提示: 來自@vadian ,因為我只執行一項任務,所以我使用了異步完成處理程序:

第二類:

func checkSpeed(completion: @escaping () -> ())
{
    // call other functions and perform task to download file from link

    // print out speed of download

    nMbps = speedOfDownload
    completion()

}

頭等艙:

let check: SecondClass = SecondClass()

check.checkSpeed {
print("speed = \(check.nMbps)")

}

現在checkSpeed將首先完成,並為speed分配適當的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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