J'essaie de créer mon premier projet avec swift 3.Synchronisation des fonctions asynchrones
J'essaie d'obtenir des données de mon API. Cela fonctionne très bien si je démarre manuellement la fonction. J'ai besoin de synchroniser la demande asynchrone.
J'ai besoin de déclencher mes fonctions 3 fois et attendre les autres pour terminer.
makeGetCall(URLstring: "api1")
attente pour terminer
makeGetCall(URLstring: "api2")
attente pour terminer
makeGetCall(URLstring: "api3")
Définir ce à fond et de déclencher toutes les 5 secondes.
func makeGetCall(URLstring: String, update: Bool) {
let completeURL = "http://myapi/" + URLstring
// Set up the URL request
guard let url = URL(string: completeURL) else {
print("Error: cannot create URL")
return
}
let urlRequest = URLRequest(url: url)
// set up the session
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
// make the request
let task = session.dataTask(with: urlRequest) {
(data, response, error) in
// check for any errors
guard error == nil else {
print("error calling GET on /todos/1")
print(error as Any)
return
}
// make sure we got data
guard let responseData = data else {
print("Error: did not receive data")
return
}
// parse the result as XML
if URLstring == "devicelist.cgi" {
self.readDevice(XMLData: responseData)
}
if URLstring == "statelist.cgi" {
self.readDeviceData(XMLData: responseData, update: update)
}
if URLstring == "functionlist.cgi" {
self.readGewerke(XMLData: responseData)
}
}
task.resume()
}
Quelqu'un peut-il vous aider s'il vous plaît.
Hagen
C'est ce que j'ai essayé avec gestionnaire d'achèvement:
override func viewDidLoad() {
super.viewDidLoad()
makeGetCall(input: "statelist.cgi") {
(result: Bool) in
print("finished statelist")
}
makeGetCall(input: "devicelist.cgi") {
(result: Bool) in
print("finished devicelist")
}
makeGetCall(input: "functionlist.cgi") {
(result: Bool) in
print("finished functionlist")
}
}
func makeGetCall(input: String, completion: @escaping (_ result: Bool) -> Void) {
let completeURL = "http://192.168.0.25/addons/xmlapi/" + input
// Set up the URL request
guard let url = URL(string: completeURL) else {
print("Error: cannot create URL")
return
}
let urlRequest = URLRequest(url: url)
// set up the session
let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
// make the request
let task = session.dataTask(with: urlRequest) {
(data, response, error) in
// check for any errors
guard error == nil else {
print("error calling GET on /todos/1")
print(error as Any)
return
}
// make sure we got data
guard data != nil else {
print("Error: did not receive data")
return
}
completion(true)
}
task.resume()
}
Si je mets les 3 appels ensemble, il a travaillé comme il se doit. Je chose qu'il faut aussi travailler avec GCD, mais la plupart des exemples pour rapide 2.
makeGetCall(input: "devicelist.cgi") {
(result: Bool) in
print("finished devicelist")
self.makeGetCall(input: "functionlist.cgi") {
(result: Bool) in
print("finished functionlist")
self.makeGetCall(input: "statelist.cgi") {
(result: Bool) in
print("finished statelist")
}
}
}
Peut-être que maintenant quelqu'un peut aider.
Merci Hagen
Ajouter un gestionnaire d'achèvement 'makeGetCall()' 'et utiliser un DispatchGroup' attendre ou être averti. – shallowThought
J'ai essayé de résoudre mon problème mais je n'ai pas travaillé. Quelqu'un peut-il me donner des conseils? – Hagen
Montrez ce que vous avez essayé avec le gestionnaire d'achèvement – shallowThought