2015-03-31 58 views
0

我在Swift以及Xcode中都很初學。我正在構建一個應用程序,在該應用程序中,我需要將服務器連接到特定的IP和端口,發送JSON請求以斷開並在代碼中的許多位置接收其響應。所以我想做一個全局函數(可以從代碼的任何部分訪問)。我也想實現一個模塊(如在VB6.0中)或文件,其中包含所有的全局函數,並可以在需要的地方調用。通過一個全局函數連接到服務器,發送請求並接收響應中的快速

我的第一個問題是,我可以使用httpGet函數將以下函數的服務器響應返回給調用函數。

該函數連接到服務器,向服務器發送請求並僅在'//返回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!; 
} 

一旦我註釋掉了 '//返回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函數連接到服務器,向服務器發送請求並將服務器響應返回給調用函數。

也讓我知道如何使這個函數作爲全局函數,以及在需要它的代碼中全局調用這個全局函數。

回答

0

httpGet異步運行。它的完成塊在請求完成之後纔會執行。這意味着您的return電話會在您下載對象之前發生,因此abc仍然是nil,儘管事實上您已用!強制解包。你必須通過httpGet完成塊(或者只是在塊內處理)通過abc

此功能應該已經可以在您的項目中看到其他源文件

+0

那麼我應該在代碼中更改什麼? – 2015-04-02 05:29:44

+0

請讓我知道,我應該改變這個功能,以便它的工作? – 2015-04-02 05:41:48

+0

尼克,您的回覆後,我搜索了更多的互聯網,並發現http://stackoverflow.com/questions/24647406/how-to-use-completionhandler-closure-with-return-in-swift。通過這個鏈接後。我懷疑我是否可以將服務器響應返回給調用函數? – 2015-04-02 06:18:16

相關問題