void函数中出现意外的非void返回值 - 来自dataTask的JSON数据(带有:URL) - (Swift 3.0)

时间:2016-08-31 11:30:53

标签: json swift3 nsurlsessiondatatask

我正在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时,我按照预期得到了#34;欢迎!"消息。问题是我想要我的握手函数返回true或false(如果case为false,我可以发出警告。)当我尝试在if语句中设置返回true或false时,我得到错误:意外的非void返回值在无效功能中。

我的问题是:如何从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()


}

}

1 个答案:

答案 0 :(得分:0)

由于您使用的是异步API,因此无法从handshake函数返回bool。如果要在错误情况下显示警报,则应将return false替换为:

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

从技术上讲,你可以暂停握手功能,直到网络内容完成,并返回bool,但这会失去异步的目的,它会冻结你的应用程序的用户界面在网络活动期间,我怀疑你想做什么。