Есть класс в котором описываются статичные методы, которые вызываются из разных вью контроллеров и запрашивают данные с интернета. Размер этих данных заранее неизвестен. Как заставить метод дожидаться полной загрузки данных?
В качестве костыля можно поставить задержку sleep(Int) после dataTask.resume(), но что если её не хватит…
Вот пример метода:
static func requestData(completion: @escaping ([DataObject]?) -> ()) {
var myData: [DataObject] = []
let request = NSMutableURLRequest(url: NSURL(string: "https://mysite/api/data")! as URL,
cachePolicy: .useProtocolCachePolicy,
timeoutInterval: 10.0)
request.httpMethod = "GET"
let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in
if error != nil { return }
if data != nil {
do {
let dataArray = try JSONSerialization.jsonObject(with: data!, options: [])
guard let jsonArray = dataArray as? [[String: Any]] else { return }
for i in jsonArray {
let dataId = i["Id"] as! Int
let dataName = i["Name"] as! String
let object = DataObject(id: dataId, name: dataName)
myData.append(object)
}
} catch {
print("Error")
print(error as Any)
}
}
})
dataTask.resume()
completion(myData)
}