Я пытаюсь создать свой первый проект со скоростью 3.Синхронизировать функции асинхронизации
Я пытаюсь получить данные из своего API. Это работает очень хорошо, если я вручную запустил функцию. Мне нужно синхронизировать запрос async.
Мне нужно трижды вызвать свою функцию и дождаться завершения остальных.
makeGetCall(URLstring: "api1")
ждать, чтобы завершить
makeGetCall(URLstring: "api2")
ждать, чтобы завершить
makeGetCall(URLstring: "api3")
Установите это в фоновом режиме и запускать каждые 5 секунд.
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()
}
Может кто-нибудь помочь пожалуйста.
Hagen
Это то, что я пытался с обработчиком завершения:
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()
}
Если я ставлю 3 вызова вместе это работало как надо. я, что он должен также работать с НОД, но большинство примеров для быстрой 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")
}
}
}
Может быть, теперь кто-то может помочь.
Благодаря Hagen
Добавить обработчик завершения 'makeGetCall()' и использовать 'DispatchGroup' для ожидания или получения уведомления. – shallowThought
Я пытался решить свою проблему, но не работал. Может кто-нибудь дать мне совет. – Hagen
Покажите, что вы пробовали с обработчиком завершения – shallowThought