2017-05-12 5 views
-2

Ich benutze eine gemeinsame Klasse, um Web-Service-Antwort zu erhalten. Jetzt möchte ich den Rückgabewert vom Web-Service in meinem ersten View-Controller zuweisen. Das Problem ist jedoch der Zuweisungscode im View-Controller, der ausgeführt wird, bevor die Web-Service-Antwort in der schnellen gemeinsamen Klasse abgeschlossen wird. Daher wird das Array als leeres Array zurückgegeben. Kann jemand bitte eine Idee geben zu warten, bis der Service-Aufruf in Swift abgeschlossen ist.Warte Ausführung einer Funktion, bis eine andere

Hier ist mein Beispielcode. Common.swift Klasse

static func getData() -> [returnArray] { 
     DispatchQueue.main.async(execute: { 
     // Request to get service data 
     // Servce response 
     let task = restObject.callObject.dataTask(with: requestObject, completionHandler: {data, response, error -> Void in 
      let object = getData(data) 
      if let values = object { 
       if values.count > 0 { 
        // Assign the values to global static array 
       } 
      } 
     }) 
     task.resume() 
     }) 
    // return the global static array 
} 

-View-Controller-Klasse: Innen didLoad Funktion Ich bin die gemeinsame Klasse über Funktion aufrufen und Zugriff auf die zurückgegebenen Array-Werte. Aber es gibt ein leeres Array zurück.

+6

Sie wollen nicht * Warten *, müssen Sie Ihre Klasse über eine Art „Rückruf“ oder „Abschluss-Handler“ registrieren. – luk2302

+0

Schauen Sie in PromiseKit: https://github.com/mxcl/PromiseKit –

+2

Bitte zeigen Sie den entsprechenden Code. – shallowThought

Antwort

2

Hier bin ich die Schaffung eines ServiceClass, die von einer anderen Klasse aufgerufen wird und somit den Anruf bekommen in der schnellen Block zurück: - 1) nicht erreichbar 2) Handler

ServiceClass.instance().hitPostService(params, unReachable: { 
    print("Connection Error. Please check your internet connection and try again.") 
}) { (response) in 
    if response != nil { 
      print_debug(response) 
    } 
} 

Ein weiterer Controller, der ServiceClass ist .

func hitPostService(params:Dictionary<String,String>,unReachable:(() -> Void),handler:((Dictionary<String,AnyObject>?) -> Void)) { 
     if networkReachable() { 
      print_debug("Params:- \(params)") 
      Alamofire.request(.POST, Constant.BASE_URL+params[Constant.kAPPEND_URL]!, parameters: params,encoding: .JSON) 
       .responseJSON { response in 
        switch response.result { 
        case .Success: 
         let result = response.result.value as? Dictionary<String,AnyObject> 

         handler(result!) //call handler block for data 
        case .Failure(let error): 
         print_debug(error) 
         handler(nil) //call handler block with nil 
        } 
      } 
     } 
     else { 
      unReachable() //call unrechable block 
     } 
    } 

Weitere Informationen über den Block können Sie erhalten von http://fuckingswiftblocksyntax.com/

+0

Vielen Dank, aber das hat nicht für mich funktioniert. – user3480213

+0

Swift 2.2 und mit Alamofire seine Arbeit gut .. –

+0

Grundsätzlich müssen Sie über Blöcke lernen. –

Verwandte Themen