Функция не дожидается загрузки данных

У меня есть следующая функция, которая загружает изображение с сервера;

func getImageFromServerById(imageId: String) -> UIImage? {
    let url:String = "https://dummyUrl.com/\(imageId).jpg"
    var resultInNSDataformat: NSData!

    let task = NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: url)!) {(data, response, error) in
        if (error == nil){
            resultInNSDataformat = data
        }
    }
    task.resume()
    return UIImage(data: resultInNSDataformat)
}

Функция не дожидается завершения задачи загрузки перед возвратом изображения. Поэтому мое приложение всегда сбой. Любые идеи о том, как дождаться загрузки?

Ответ 1

Другой ответ не является хорошей заменой для кода, который у вас уже был. Лучшим способом было бы продолжить работу с задачами данных NSURLSession, чтобы операция загрузки была асинхронной и добавила свой собственный блок обратного вызова к методу. Вам нужно понять, что содержимое блока задач загрузки не выполняется до того, как вы вернетесь из своего метода. Просто посмотрите, где вызов возобновить() для дальнейших доказательств.

Вместо этого я рекомендую что-то вроде этого:

func getImageFromServerById(imageId: String, completion: ((image: UIImage?) -> Void)) {
    let url:String = "https://dummyUrl.com/\(imageId).jpg"

    let task = NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: url)!) {(data, response, error) in
        completion(image: UIImage(data: data))
    }

    task.resume()
}

Что можно назвать так:

getImageFromServerById("some string") { image in
    dispatch_async(dispatch_get_main_queue()) {
        // go to something on the main thread with the image like setting to UIImageView
    }
}