来自函数的Swift dispatch_async

时间:2015-09-20 23:14:41

标签: ios swift alamofire dispatch-async

我怎么能等到函数从alamofire获取请求获取所有数据?

GetData.swift文件:

import Foundation
import Alamofire
import SwiftyJSON
import ObjectMapper

func getStartData() -> Void {
    let sharedBranch = BranchSingleton.sharedInstance
    let sharedArticle = ArticleSingleton.sharedInstance

    Alamofire.request(.GET, Config().apiBranch)
        .responseJSON { request, response, result in
            let jsonObj = SwiftyJSON.JSON(result.value!)
            for obj in jsonObj {
                let branch = Mapper<Branch>().map(obj.1.rawString()!)
                sharedBranch.addBranch(branch!)
            }
    }
    Alamofire.request(.GET, Config().apiArticle)
        .responseJSON { request, response, result in
            let jsonObj = SwiftyJSON.JSON(result.value!)
            for obj in jsonObj {
                let article = Mapper<Article>().map(obj.1.rawString()!)
                sharedArticle.addArticle(article!)
            }
    }
}

ViewController.swift文件:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        getStartData() // need to wait until all requests are finished then do print
        print(sharedArticle.articleList)

    }

}

SingletonObj.swift文件:

import Foundation

class BranchSingleton {
    var branchList: [Branch] = []

    class var sharedInstance: BranchSingleton {
        struct Static {
            static let instance: BranchSingleton = BranchSingleton()
        }
        return Static.instance
    }

    func addBranch(branch: Branch) {
        branchList.append(branch)
    }
}
class ArticleSingleton {
    var articleList: [Article] = []

    class var sharedInstance: ArticleSingleton {
        struct Static {
            static let instance: ArticleSingleton = ArticleSingleton()
        }
        return Static.instance
    }

    func addArticle(article: Article) {
        articleList.append(article)
    }
}

我需要等到getStartData()完成,然后pring singleton array ..

我该怎么做?

这个getStartData包含2个以上的请求,但我刚给出了2 ..

的例子

1 个答案:

答案 0 :(得分:1)

你问了一个非问题。 没有理由到&#34;等待&#34;。你也不是。你只是异步地做你做的事。同时界面必须保持活动状态;用户必须能够继续工作。因此没有什么可以等待&#34;

现在,如果问题是,当所有请求完成后,如何以优雅的方式向应用程序的其余部分发送信号,一个好的答案就是使用NSProgress。所有不同的请求都可以为常见的NSProgress对象做出贡献。好的是它的fractionCompleted可用KVO观察到,所以当它大于或等于1.0时,你就完成了。

但你实际上并不需要NSProgress;你可以只增加或减少一个KVO可观察的实例变量(当然要小心线程)。如果您知道有n个进程,那么您可以在n处启动一个变量,并让每个进程在完成时递减它;变量的didSet观察者可以在我们达到零时采取行动。

重点在于:你不要等待&#34;你只是让所有不同的活动有助于一些共同的中心价值,而这些价值已经过去了。这意味着我们已经完成&#34;然后可以采取行动。