Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
899 views
in Technique[技术] by (71.8m points)

swift - How to know when multiple web calls have ended, to call completion

I'm fairly new to Swift and this question is probably really stupid. So bear with me please.

I have a collection of devices that I want to reset, using a Webservice call. Here is what my Function looks like now (no completion yet)

func resetDevice(completion: () -> ()) {
    for device in devices {
        device.isValid = 0
        DeviceManager.instance.updateDevice(device).call { response in
            print("device reset")
        }
    }
}

I'm not quite sure were to call my completion, neither how to be 100% sure all calls have ended. Any help ?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I'd suggest using dispatch groups:

func resetDevice(completion: () -> ()) {
    let dispatchGroup = DispatchGroup()

    for device in devices {

        dispatchGroup.enter()

        device.isValid = 0

        DeviceManager.instance.updateDevice(device).call { response in
            print("device reset")
            dispatchGroup.leave()
        }
    }

    dispatchGroup.notify(queue: DispatchQueue.main) {
        // Some code to execute when all devices have been reset
    }
}

Each device enters the group immediately, but doesn't leave the group till the response is received. The notify block at the end isn't called until all objects have left the group.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...