Search code examples
iosswiftalamofiredispatch-async

Swift dispatch_async from function


How can i wait until function get all data from alamofire get request?

GetData.swift file:

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 file:

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 file:

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)
    }
}

i need to wait until getStartData() finish, then pring singleton array..

How can i do that?

This getStartData contains more than 2 requests, but i just gave example with 2..


Solution

  • You're asking a non-question. There is no reason to "wait". Nor can you. You just do what you do, asynchronously. Meanwhile the interface must stay active; the user must be able to continue to work. Thus there is nothing to "wait" for.

    Now, if the question is, how can you send a signal in some elegant way to the rest of your app when all of the requests are done, one good answer is to use NSProgress. All the different requests can contribute to a common NSProgress object. The nice thing is that its fractionCompleted is observable with KVO, so when it comes greater-than-or-equal-to 1.0, you're done.

    But you don't actually need the NSProgress; you could just increment or decrement an instance variable that's KVO-observable (being careful about threading, of course). If you know there are n processes, then you could just start a variable at n and have each process decrement it when it completes; a didSet observer on the variable can then take action when we hit zero.

    The point is: you don't "wait": you just have all the different activities contribute to some common central value that "knows" when this means we've "finished" and can then take action.