2016-06-24 6 views
0

Wie kann ich eine Funktion zum Aufruf RESTful API durch NSURLSESSION, die auf jedem Controller in schnellen iOS, d. H. Singleton-Objekt für überall in der App Dies ist der Code, den ich kam. Aber sobald ich die Methode aufruft, stürzt es ab, bis die jsonresponse leer ist.Wie man globale Funktion für REST APIs durch nsurlsession in swift iOS macht?

func apicall (mainurl : String, method :String,params :String) -> NSDictionary{ 

    var jsonresponse = NSDictionary() 
    let url:NSURL = NSURL(string: mainurl)! 
    let session = NSURLSession.sharedSession() 

    let request = NSMutableURLRequest(URL: url) 
    request.HTTPMethod = method 
    //  request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData 

    let paramString = params 
    request.HTTPBody = paramString.dataUsingEncoding(NSUTF8StringEncoding) 

    let task = session.dataTaskWithRequest(request) { 
     (
     let data, let response, let error) in 
     enum JSONError: String, ErrorType { 
      case NoData = "ERROR: no data" 
      case ConversionFailed = "ERROR: conversion from JSON failed" 
     } 
     do{ 
      guard let _:NSData = data, let _:NSURLResponse = response where error == nil else { 
       print("error") 
       throw JSONError.NoData 
      } 
      print("data = \(data), response = \(response) , error = \(error)") 


      guard let json = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? NSDictionary else { 
       throw JSONError.ConversionFailed 
      } 
      jsonresponse = json 

     } 
     catch let error as JSONError { 
      print(error.rawValue) 
     } catch let error as NSError { 
      print(error.debugDescription) 
     } 
    } 
    task.resume() 

    return jsonresponse 
} 

}

+0

'Wache lassen _: NSData, lassen _: NSURLResponse = Antwort' Ich sehe diesen Unsinn Stück Code regelmäßig. Ich weiß nicht, von welchem ​​"populären" Tutorial oder von welcher Antwort es kommt, aber ich schlage vor, dass Sie das nie wieder verwenden und stattdessen das richtige Auspacken von Werten verwenden. Traue nicht zufälligen Tutorials im Web, die meisten sind einfach mittelmäßig, andere sind einfach falsch. – Moritz

+0

@EricD Ich denke, dieser Code überprüft, ob ich Daten oder eine Antwort von der URL zurückbekommen habe und ob es einen Fehler gibt oder nicht. Bitte geben Sie mir einen schöneren Code, falls verfügbar. TIA –

+0

Besseres Beispiel [hier] (http://stackoverflow.com/a/31808605/2227743). Sehen Sie, wie wir das Ergebnis von 'guard' tatsächlich verwenden *, anstatt es zu ignorieren. – Moritz

Antwort

0

NSUrlSession Reference

1.Shared seesion Rückkehr Standardsitzung des Singleton-Objekt. Wenn Sie eine eigene Sitzung verwenden möchten, erstellen Sie eine Methode für die Rückgabe des Singletons der Sitzung.

func restAPICall(requestUrl:NSURL, httpMethod:String, params:NSDictionary) 
     { 
      let session = NSURLSession.sharedSession() 
      var dataTask: NSURLSessionDataTask; 
      do 
      { 
       let httpData = try NSJSONSerialization.dataWithJSONObject(params, options: .PrettyPrinted) 
       let request = NSMutableURLRequest.init(URL: requestUrl) 
       request.addValue("application/json", forHTTPHeaderField: "Content-Type"); 
       request.HTTPBody = httpData 
       request.HTTPMethod = "POST" 

       dataTask = session.dataTaskWithRequest(request){(data, response, error) in 

        do 
        { 
         let jsonData = try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) 
         print("\(ViewController.count)----------\n" + jsonData.description + "\n--------------\n"); 
         ViewController.count = ViewController.count + 1 

        } 
        catch 
        { 
         print(error) 
        } 
       } 


       dataTask.resume(); 
      } 
      catch 
      { 
       print(error) 
      } 
     } 
+0

Kann die Session-Konfiguration nach Ihren Anforderungen ändern, aber es wird empfohlen, Singleton-Objekt für die Sitzung zu verwenden –

+0

Wie bekomme ich die Antwort? Ich kann keinen Rückruf sehen –

+0

@RajAggrawal hey es tut mir leid für meine späte Antwort. Eigentlich habe ich das implementiert, aber das Hauptproblem ist, wie bekomme ich die Antwort zurück, wo ich die Funktion aufgerufen habe –