Как запустить код в порядке? [Дубликат]

ROUND(time_to_sec((TIMEDIFF(NOW(), "2015-06-10 20:15:00"))) / 60);
20
задан Moritz 7 July 2015 в 09:10
поделиться

1 ответ

Вы не можете возвращать данные непосредственно из асинхронной задачи.

Решение с Swift 2 должно сделать обработчик завершения следующим образом:

class PostFOrData {
    // the completion closure signature is (NSString) -> ()
    func forData(completion: (NSString) -> ()) {
        if let url = NSURL(string: "http://210.61.209.194:8088/SmarttvWebServiceTopmsoApi/GetReadlist") {
            let request = NSMutableURLRequest( URL: url)
            request.HTTPMethod = "POST"
            let postString : String = "uid=59"
            request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
            let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
                data, response, error in
                if let data = data,
                    jsonString = NSString(data: data, encoding: NSUTF8StringEncoding)
                    where error == nil {
                        completion(jsonString)
                } else {
                    print("error=\(error!.localizedDescription)")
                }
            }
            task.resume()
        }
    }
}


let pfd = PostFOrData()

// you call the method with a trailing closure
pfd.forData { jsonString in
    // and here you get the "returned" value from the asynchronous task
    print(jsonString)
}

Таким образом, завершение вызывается только тогда, когда асинхронная задача завершена. Это способ «вернуть» данные без фактического использования return.

версия Swift 3

class PostFOrData {
    // the completion closure signature is (String) -> ()
    func forData(completion:  @escaping (String) -> ()) {
        if let url = URL(string: "http://210.61.209.194:8088/SmarttvWebServiceTopmsoApi/GetReadlist") {
            var request = URLRequest(url: url)
            request.httpMethod = "POST"
            let postString : String = "uid=59"
            request.httpBody = postString.data(using: String.Encoding.utf8)
            let task = URLSession.shared.dataTask(with: request) {
                data, response, error in
                if let data = data, let jsonString = String(data: data, encoding: String.Encoding.utf8), error == nil {
                    completion(jsonString)
                } else {
                    print("error=\(error!.localizedDescription)")
                }
            }
            task.resume()
        }
    }
}


let pfd = PostFOrData()

// you call the method with a trailing closure
pfd.forData { jsonString in
    // and here you get the "returned" value from the asynchronous task
    print(jsonString)
}
32
ответ дан Nebojsa Nadj 16 August 2018 в 04:30
поделиться
  • 1
    1) Это было быстро для Swift 3! 2) , исходя из фона Objective-C, это немного запутанно. Вы не видите ключевое слово completionHandler в Swift. Это что-то выведенное? – Honey 26 June 2016 в 22:10
  • 2
    Да. Это стандартный синтаксис Swift. Если замыкание определено в конце функции, то замыкание может быть определено после закрывающего ')' скобки и исключено имя параметра. Их называют закрывающими закрытиями. См. developer.apple.com/library/mac/documentation/Swift/Conceptual/… – user1956608 21 August 2016 в 19:00
Другие вопросы по тегам:

Похожие вопросы: