func getAll(completion: (([Foods]?, Error?) -> Void)?){
        var foodWithEname: [Foods]?
        let food: Food? = Food()
        var sortedFood: [Foods]?
        food?.getFoods(){ (foodsArray, error) in
            sortedFood = foodsArray?.sorted{ (left, right) in
                if let lh = left.hits  {
                    if let rh = right.hits {
                        return left.hits! > right.hits!
                    }
                    return true
                } else {
                    if let rh = right.hits {
                        return false
                    }
                    return false
                }
            }


            for fa in foodsArray! {

                var f = Foods(fid: fa.fid, fname: fa.fname, hits: fa.hits, addr: fa.addr, ename: nil)

                food?.getEffectsById(fa.fid){ (effectsArray, error) in
                    //foodWithEname?.ename = effectsArray
                    print ("11111")

                    DispatchQueue.global().async {
                        f.ename = effectsArray
                        print ("2222")
                        foodWithEname?.append(f)
                    }
                }

                DispatchQueue.global().async (execute: {
                    print ("00000")

                })

            }
            print("3333")
            completion?(foodWithEname, nil)
        }
        print ("4444")
    }

我需要将foodWithName值返回到主视图,但由于线程流的原因,它没有返回值。。。
我不知道如何控制闭包的流量。
我在MainView中调用了函数:
let food: Food? = Food()
food?.getAll(){ (foodsArray, error) in

        }

结果:
四千四百四十四
三千三百三十三
00000个
00000个
00000个
00000个
00000个
00000个
00000个
00000个
00000个
00000个
00000个
00000个
00000个
00000个
00000个
00000个
00000个
00000个
00000个
00000个
00000个
00000个
00000个
00000个
00000个
00000个
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
一万一千一百一十一
二千二百二十二
我想要如下结果:
2222 000001111 2222 000001111 2222 00000。。。三千三百三十三
完成时数组值应该在foodWithName中?(foodWithName,nil)被执行。
请帮忙解决这个问题,谢谢!

最佳答案

在第二个循环中,您在一个循环中发送多个异步调用,当结果等待时,您调用了完成处理程序,因此结果为空。
您需要在分派组中调用这些异步调用,当所有执行完成时,将结果返回到完成处理程序。
在第二个循环中执行类似的操作:

// Create dispatch group
let group = DispatchGroup()

for fa in foodsArray! {

    var f = Foods(fid: fa.fid, fname: fa.fname, hits: fa.hits, addr: fa.addr, ename: nil)

    // Enter in group just before the call
    group.enter()

    food?.getEffectsById(fa.fid){ (effectsArray, error) in
        //foodWithEname?.ename = effectsArray
        print ("11111")

        DispatchQueue.global().async {
            f.ename = effectsArray
            print ("2222")

            // Leave the group when task is completed
            group.leave()

            foodWithEname?.append(f)
        }
    }

    DispatchQueue.global().async (execute: {
        print ("00000")

    })
}
print("3333")

// Wait for all tasks to complete, and call the completion handler
group.notify(queue: DispatchQueue.main) {
    completion?(foodWithEname, nil)
}

10-08 01:21