2016-08-23 7 views
2

私のコードは動作しますが、変数を返すものを保つことはできません。 私は印刷することしかできませんが、変数として格納する呼び出しとしてはできません。 webserviceに使用するクラスをアタッチしました。ビューコントローラの使用では即時にwebserviceを呼び出した後で、非同期呼び出し関数からデータを返し、変数を保存します

class WebService{ 

    class func llamarWebService(completionHandler: (datos:NSArray)->()){ 

     let urlPath = "http://aaaaaaaaa.com.ar/aaaaaaaaa/forwarder_number?phone=0000000000" 
     let url = NSURL(string: urlPath) 
     let session = NSURLSession.sharedSession() 
     var arreglo:NSArray! 
     let task = session.dataTaskWithURL(url!,completionHandler: {data,response,error -> Void in 

      if (error != nil){ 
       print(error?.localizedDescription) 
      } 

      let nsdata: NSData = NSData(data: data!) 

      arreglo = self.retornarDatos(nsdata) 
      completionHandler(datos: arreglo) 


     }) 
     task.resume() 
    } 

    class func retornarDatos(nsdata: NSData)-> Array<String>{ 

     let datos = NSString(data:nsdata,encoding: NSUTF8StringEncoding) 
     let partes = datos?.componentsSeparatedByString(",") 
     var arreglo : [String] = [] 
     for i in partes!{ 
      arreglo.append(i) 
     } 

     return arreglo 
    } 

} 

この

var resultadoWebService = WebService.llamarWebService{ 
    datos in print([datos[0],datos[1],datos[2],datos[3],datos[4]]) 
} 

私は、例えば、保存必要があります:実際にコード

var1 = datos[0] 
var2 = datos[1] 

、OK、LeoAndroid [コンソールに

を私を見ます20,2,2222222222]

+0

'[OK、LeoAndroid、20、2、2222222222]の出力はOKですが、これらの5つの値を変数に代入する方法を尋ねていますか? – Rob

+0

まさに、ちょうど私が欲しい。 –

答えて

0

最初に、resultadoWebServiceを使用しても意味がありません。だから、私はあなたのスニペットを次のように簡略化します:

WebService.llamarWebService { datos in 
    print([datos[0],datos[1],datos[2],datos[3],datos[4]]) 
} 

次に、変数の更新について尋ねました。実際には、ローカル変数を更新する必要はありませんが、呼び出し元オブジェクトのプロパティを更新したいことがあります。もしそうなら、どのようなUI更新(または何でも)クロージャ内でそれらを更新し、トリガ、結果を得るために適切である:さて、datosは常に5つの項目を持っているかどうか、そしてあなたがそれをチェックするかどうか

var var1: String? 
var var2: String? 

func performRequestAndUpdateUI() { 
    WebService.llamarWebService { datos in 
     guard datos.count == 5 else { 
      print("didn't get the number of items data I expected") 
      return 
     } 

     guard datos[0] == "OK" else { 
      print("not everything was OK") 
      return 
     } 

     // note, you probably want to dispatch all model updates to the main queue 
     // to simplify synchronization. also UI updates must happen on main queue, 
     // too. 

     dispatch_async(dispatch_get_main_queue()) { 
      self.var1 = datos[1] 
      self.var2 = datos[2] 
      ... 
      // do whatever UI updates you want here 
     } 
    } 

    // but don't try to use `datos` results here, because the above runs 
    // asynchronously and we don't have the result by the time we get here 
    // in our code. 
} 

datos[0]OKでしたが、それはすべてあなた次第ですが、うまくいけば、非同期メソッドを扱っているというアイデアを示しているので、クロージャで渡された値をただちに使用することはできません。閉鎖自体へのそれらの使用。また、モデルやUIを更新する場合は、そのスレッドをメインスレッドにディスパッチしてください。しかし、Webサービスからの応答は非同期であり、後で呼び出されることはないため、変数をただちに更新することはできません。


私は多分そうのようなオプションのチェーンを使用して、!強制アンラップ演算子を切除され、retornarDatos少しより安全な(かつ簡単)を提案するかもしれません:あなた本当にがしたい場合は

class func retornarDatos(data: NSData) -> [String]? { 
    return String(data: data, encoding: NSUTF8StringEncoding)? 
     .componentsSeparatedByString(",") 
} 

あるいは、現在の演出のようなエラー時に空の文字列の配列を返し、あなたができる:

class func retornarDatos(data: NSData) -> [String] { 
    return String(data: data, encoding: NSUTF8StringEncoding)? 
     .componentsSeparatedByString(",") ?? [String]() 
} 

ところで、私はあなたが上記のコード/コンセプトの周りにあなたの腕を得ることをお勧めします。しかし、いったんやったら、あなたのウェブサービスデザインを再評価したいかもしれません。解析プロセスがより堅牢で、基本的なWebサービスのエラーと、何かを正常に返すWebサービス(「OK」であろうとなかろうと)を区別することが容易になるため、JSONを使用することを検討することをお勧めします。

+0

私は、あなたが私を育てたすべてのことを応援しています。 この素晴らしい説明をありがとう。 –

+0

それは完全に働いて、説明と迅速な解決に永遠に感謝しています。 よろしく! –

関連する問題