Wait for Swift function to finish

I have a function to get data from json and I add all data to an array. I am trying to create a semaphore and wait for the signal to be sent to the semaphore to continue, but it doesn't work (I'm not sure if I am doing this correctly or not), then I saw a question on Stackoverflow, the answer was a completion handler like this

func application(application: UIApplication!, performFetchWithCompletionHandler completionHandler: ((UIBackgroundFetchResult) -> Void)!) {
    getUrunGrup(completionHandler)
}

      

so i changed my function like this

func getUrunGrup(completionHandler: ((UIBackgroundFetchResult) -> Void)!){
    Alamofire.request(.GET, "http://213.136.86.160:27701/Thunder/DataService/GetUrunGrup")
        .responseJSON {(request, response, jsonObj, error) in
            if let jsonresult:NSDictionary = jsonObj as? NSDictionary{
                if let result: AnyObject = jsonresult["Result"] {
                    let elementCount = result.count
                    for (var i = 0; i<elementCount; ++i){
                        if let name: AnyObject = result[i]["Adi"]!{
                            if let kod:AnyObject = result[i]["Kod"]!{
                                urunUstGrup.append(["Adi": "\(name)", "Kod": "\(kod)"])
                                println("getUrunGrup \(i)")


                                }
                            }
                        }
                    }
                }

            }
    completionHandler(UIBackgroundFetchResult.NewData)
    println("Background Fetch Complete")

    }

      

But there is no answer, how can I call this function?

+3


source to share


1 answer


you need to pass your async call function to a handler to call later, like:

func application(application: UIApplication!, performFetchWithCompletionHandler completionHandler: ((UIBackgroundFetchResult) -> Void)!) {
    loadShows(completionHandler)
}

func loadShows(completionHandler: ((UIBackgroundFetchResult) -> Void)!) {
    //....
    //DO IT
    //....

    completionHandler(UIBackgroundFetchResult.NewData)
    println("Background Fetch Complete")
}

      

OR (cleaner way IMHO)



add intermediate completionHandler

func application(application: UIApplication!, performFetchWithCompletionHandler completionHandler: ((UIBackgroundFetchResult) -> Void)!) {
    loadShows() {
        completionHandler(UIBackgroundFetchResult.NewData)
        println("Background Fetch Complete")
    }
}

func loadShows(completionHandler: (() -> Void)!) {
    //....
    //DO IT
    //....
    completionHandler()
}

      

+2


source







All Articles