相关疑难解决方法(0)

等到swift for循环,异步网络请求完成执行

我希望for循环向firebase发送一堆网络请求,然后在方法完成执行后将数据传递给新的视图控制器.这是我的代码:

var datesArray = [String: AnyObject]()

for key in locationsArray {       
    let ref = Firebase(url: "http://myfirebase.com/" + "\(key.0)")
    ref.observeSingleEventOfType(.Value, withBlock: { snapshot in

        datesArray["\(key.0)"] = snapshot.value
    })
}
// Segue to new view controller here and pass datesArray once it is complete 
Run Code Online (Sandbox Code Playgroud)

我有几个问题.首先,我如何等待for循环完成并且所有网络请求都已完成?我无法修改observeSingleEventOfType函数,它是firebase SDK的一部分.另外,我是否会通过尝试从for循环的不同迭代中访问datesArray来创建某种竞争条件(希望这是有道理的)?我一直在阅读有关GCD和NSOperation的内容,但我有点失落,因为这是我构建的第一个应用程序.

注意:Locations数组是一个包含我需要在firebase中访问的键的数组.此外,重要的是异步触发网络请求.我只想等到所有异步请求完成后再将datesArray传递给下一个视图控制器.

asynchronous nsoperation grand-central-dispatch swift

138
推荐指数
7
解决办法
6万
查看次数

如何利用NSLock防止函数触发两次?

我目前有一组异步函数,它们都被调用viewDidLoad().在每个函数的末尾是一个bool,在函数完成后从false设置为true.还有一个条件语句检查两个函数的bool,它们触发第三个函数.这个条件语句是两个功能(当我想叫两个两个已完成).通常:

var checkOne = false
var checkTwo = false

func functionOne(){
    //async stuff
    checkOne = true
    if checkOne == true && checkTwo == true{
        functionThree()//will only run if both functionOne and functionTwo have been completed
    }
}

func functionTwo(){
    //async stuff
    checkTwo = true
    if checkOne == true && checkTwo == true{
        functionThree()//will only run if both functionOne and functionTwo have been completed
    }
}

func functionThree(){
    //stuff
}


override func viewDidLoad() {

    functionOne()
    functionTwo()
} …
Run Code Online (Sandbox Code Playgroud)

asynchronous nslock swift

6
推荐指数
2
解决办法
4553
查看次数