Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何防止使用闭包时出现计时问题?_Ios_Swift_Closures_Dispatch Queue - Fatal编程技术网

Ios 如何防止使用闭包时出现计时问题?

Ios 如何防止使用闭包时出现计时问题?,ios,swift,closures,dispatch-queue,Ios,Swift,Closures,Dispatch Queue,我试图找到从不同的转义闭包返回的数字的总和。要在主线程中返回的总和 import Foundation var randomTime: Int { return Int.random(in: 0...1000) } func first(completion: @escaping (Int) -> Void) { DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(randomTime)) { c

我试图找到从不同的转义闭包返回的数字的总和。要在主线程中返回的总和

import Foundation

var randomTime: Int {
  return Int.random(in: 0...1000)
}

func first(completion: @escaping (Int) -> Void) {
  DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(randomTime)) {
    completion(1)
  }
}

func second(completion: @escaping (Int) -> Void) {
  DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(randomTime)) {
    completion(2)
  }
}

func third(completion: @escaping (Int) -> Void) {
  DispatchQueue(label: "anotherThread").async {
    completion(3)
  }
}

func fourth(completion: @escaping (Int) -> Void) {
  DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(randomTime)) {
    completion(4)
}
}

如果我把你的问题弄清楚了,你需要求和,但它们的值在不同的时间出现,这取决于服务器响应或某种延迟。如果是这样,那么你必须使用

这是一个帮助函数,它首先调用您的方法
(完成:@escaping(Int)->Void)
<代码>第四个(完成:@escaping(Int)->Void)并仅在收到最后一个值时通知主队列。我在代码上添加了一些注释以帮助理解。如果有什么不清楚,请告诉我


    func computeOutPutAfterReceivingAllValues(completion: @escaping(_ sum: Int) -> Void) {
        // Make a dispatch group which will notify main queue after making sure that all requests have been proceed.
        let computeGroup = DispatchGroup()
        var allNumbers: [Int] = []
        computeGroup.enter()
        first { (firstNumber) in
            allNumbers.append(firstNumber)
            self.second(completion: { (secondNumber) in
                allNumbers.append(secondNumber)
                self.third(completion: { (thirdNumber) in
                    allNumbers.append(thirdNumber)
                    self.fourth(completion: { (fourthNumber) in
                        allNumbers.append(fourthNumber)
                         // IMPORTANT: Leave a group after the last call.
                        computeGroup.leave()
                    })
                })
            })

        }


        // Notify Main queue and sum all your numbers
        computeGroup.notify(queue: .main) {
            /// Sum all your numbers in main queue
            let sum = allNumbers.reduce(0, +)
            completion(sum)
        }
    }

用法: 您可以在view didLoad中对此进行测试

 override func viewDidLoad() {
        super.viewDidLoad()
        computeOutPutAfterReceivingAllValues { (sum) in
            print("Here is the sum of all numbers: \(sum)")
        }
    }

// Output on console
    Here is the sum of all numbers: 10



你预计会出现什么时间问题?只有一个主队列,所以调用将按串行顺序处理。有趣的是,我甚至不知道全局上下文中允许使用计算属性