-1

我正在用 Swift 3 构建一个 iOS 应用程序,它应该与我自己构建的 JSON Rest Api 进行通信。该应用程序将从 Api 获取各种内容,但现在我需要它做的就是通过握手功能检查 Api 的可用性。

let task = URLSession.shared.dataTask(with: url) { (data, response, error) in

        if error != nil {

            print(error)

        } else {

            if let urlContent = data {

                do {

                    let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary

                    if jsonResult["response"] as! String == "Welcome, come in!" {
                        print("************ RESPONSE IS: ************")
                        print(jsonResult)
                        return

                    } else {
                        return
                    }

                } catch {

                    print("************ JSON SERIALIZATION ERROR ************")

                }

            }

        }
    }

    task.resume()

这是我设置的 dataTask,它运行得很好(当我打印 jsonResult 时,我收到“欢迎!”消息如预期的那样。问题是我希望我的握手函数返回 true 或 false(所以我如果情况为假,则可以发出警报。)当我尝试在 if 语句中设置 return true 或 false 时,我收到错误:Unexpected non-void return value in void function。

我的问题是:如何从 dataTask 中返回数据,以便在握手函数中对其进行检查?我对 Swift 很陌生,所以感谢所有帮助:)

下面是整个班级:

import Foundation

class RestApiManager: NSObject {

var apiAvailability:Bool?

func handshake() -> Bool {

    let url = URL(string: "https://api.restaurapp.nl/handshake.php")!

    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in

        if error != nil {

            print(error)

        } else {

            if let urlContent = data {

                do {

                    let jsonResult = try JSONSerialization.jsonObject(with: urlContent, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary

                    if jsonResult["response"] as! String == "Welcome, come in!" {
                        print("************ RESPONSE IS: ************")
                        print(jsonResult)
                        return true

                    } else {
                        return false
                    }

                } catch {

                    print("************ JSON SERIALIZATION ERROR ************")

                }

            }

        }
    }

    task.resume()


}

}

4

1 回答 1

0

因为您使用的是异步 API,所以无法从handshake函数中返回布尔值。如果您想在错误的情况下显示警报,您可以将 替换为以下内容return false

DispatchQueue.main.async {
    self.showAlert()
}

从技术上讲,您可以让握手功能暂停,直到网络工作完成并返回布尔值,但这违背了异步的目的,并且它会在网络活动期间冻结您的应用程序的 UI,所以我怀疑这就是您想要做的.

于 2016-08-31T11:48:16.297 回答