通过swift中的一个全局函数连接到服务器,发送请求和接收响应

时间:2015-03-31 14:31:51

标签: iphone json swift xcode6 global

我非常喜欢swift和Xcode。我正在构建一个应用程序,我需要在特定的IP和端口上连接服务器,向服务器发送JSON请求并在代码中接收许多地方的响应。所以我想为此创建一个全局函数(可以从代码的任何部分访问)。我还想实现一个模块(比如在VB6.0中)或一个包含所有全局函数的文件,并且可以在需要的地方调用。

我的第一个问题是,在使用httpGet函数时,我是否可以将以下函数的服务器响应返回给调用函数。

此功能连接到服务器,向服务器发送请求并仅在'// return abc!;'时获取响应。代码被评论。

func connserv(jsonString:NSDictionary) -> NSDictionary{
    var abc: NSDictionary?
    // This is the action performed when clicked on the Connect button on the connectivity screen
    println("------------------Function connserv")

    let prefs = NSUserDefaults.standardUserDefaults()
    var IP: AnyObject = prefs.objectForKey("IP")!
    var port: AnyObject = prefs.objectForKey("Port")!
    println("IP in Connection : \(IP)")
    println("port in Connection : \(port)")
    prefs.synchronize()
    //var learn = LearnNSURLSession()
    let localizedModel = UIDevice.currentDevice().localizedModel
    let model = UIDevice.currentDevice().model
    let devicesystemVersion = UIDevice.currentDevice().systemVersion

    println("HTTP request jsonString : \(jsonString)")
    var request = NSMutableURLRequest(URL: NSURL(string: "https://\(IP):\(port)/")!)

    var response: NSURLResponse?
    var error: NSError?

    //println("HTTP request jsonString : \(jsonString)")

    var err: NSError?
    request.HTTPBody = NSJSONSerialization.dataWithJSONObject(jsonString, options: nil, error: &err)
    request.HTTPMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.setValue("application/json", forHTTPHeaderField: "Accept")
    // send the request
    var learn = LearnNSURLSession()
    println("HTTP request : \(request)")
    learn.httpGet(request) {
        (resultString, error) -> Void in
        if error != nil
        {
            println("completion block")

        }
        else
        {
            let data = (resultString as NSString).dataUsingEncoding(NSUTF8StringEncoding)
            var er: NSError?
            let JSONdata: AnyObject = NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers,error: &er)!

            let abc: AnyObject = NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves, error:&er)!

            println("abc : \(abc)")
            println("JSONdata : \(JSONdata)")

            learn.callback(result: resultString, error: error)
        }
    }
    //return abc!;
}

一旦我取消评论'// return abc!;'代码此函数无法连接到服务器,也不会将请求发送到服务器并出现以下错误:

enter image description here

HTTP request : <NSMutableURLRequest: 0x7b99abf0> { URL: https://144.1.1.45:9299/ }
fatal error: unexpectedly found nil while unwrapping an Optional value

请让我知道如何更正此功能,以便 connserv 功能连接到服务器,向服务器发送请求并将服务器响应返回给调用函数。

另请告诉我如何将此函数作为全局函数,以及在需要它的代码中全局调用此全局函数。

1 个答案:

答案 0 :(得分:0)

httpGet以异步方式运行。它的完成块在请求完成之后才会执行。这意味着,在您下载对象之前,您的return来电正在进行,因此abc在此时仍然是nil,尽管您已用{强制解包 - ! {1}}。您必须通过abc完成块传递httpGet(或者只是在块内处理它)。

此功能应该已经对项目中的其他源文件可见