2016-04-02 7 views
1

私はポート3000でローカルに実行しているサーバーに対してNSURLSessionを使用してSwift 2.2で単純なAPIクライアントを作成しようとしています。サーバーは静的な文字列JSONのSwift NSURLSessionローカルサーバーへのリクエスト - 送受信されたデータなし

これは正常に動作します:APIをヒットする

$ curl http://localhost:3000 
{"data":"value"} 

マイスウィフトコードは次のとおりです。

// api_client.swift 

let url = NSURL(string: "http://localhost:3000/api") 

let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in 
    print("The response was:") 
    print(NSString(data: data!, encoding: NSUTF8StringEncoding)) 
} 

print("Running the request...") 
task.resume() 

私は、コマンドライン

$ swift api_client.swift 
Running the request... 

からそれを実行しようとしています。しかしそれはすべて起こります。私は、 "応答は"行が印刷されて表示されない、またはサーバーからの応答。サーバーのログをチェックすると、要求がまったく入力されなかったことがわかります。

私は間違っていますか?私はSwiftにはとても新しいので、これを理解するのに問題があります。私はSwift 2.2とXCode 7.3を使っています。

+0

私の推測では、このメソッドは非同期であり、メソッドが実行を終了する前にランタイムがコードの終わりに到達しているので、補完は呼び出されません。 – pbush25

+0

@ pbush25だから私はこれをテストし、それを修正することができますか?このようなコードを実行するにはどうすればよいでしょうか?私はまだこの作品を稼働させるために、まだ完全なiOSアプリを作りたいとは思っていません(それは最終的に目標です)。 – akowalz

+0

このコードをコマンドラインから*実行すると、この場合アプリケーションには実行ループがないため、*動作しません。これを見てください:http://stackoverflow.com/questions/30702387/using-nsurlsession-from-a-swift-command-line-program – Moritz

答えて

0

pbush25のおかげで私は、非同期要求がキックオフ前に、実行時にファイルの終わりに達したため、私のリクエストが実行されなかったことを考え出しました。

Another user with this problemはセマフォを使用して解決しましたが、これが問題であったことを証明するための迅速かつ汚れた方法は、コードの末尾にsleep(1)を追加することでした。私がこれを行うと、ログに要求が表示され、データが返されます。

0

pbush25の説明に従います。あなたのコードでコールバックを作成しようとすることはできますか?

func GET(path : String, callback: (result: NSData?, response: NSHTTPURLResponse?, error: NSError?) -> Void) { 
    let session = NSURLSession.sharedSession() 
    let url = NSURL(string: path) 
    let task = session.dataTaskWithURL(url!){ 
     (data, response, error) -> Void in 
      if (error != nil) { 
       // return the NSData as nil (since you have an error) 
       callback(result: nil, response: response as? NSHTTPURLResponse, error: error!) 
      } else { 
       // return the NSData 
       callback(result: data, response: response as? NSHTTPURLResponse, error: nil) 
      } 
     } 
    task.resume() 
} 

そしてであなたの関数を呼び出す:

GET("http://localhost:3000/api") { 
    (data, response, error) -> Void in 
    print(data) 
} 
+0

私はいくつかの間違いのためにコードを編集しなければなりませんでしたが、一度やってしまえば、もう一度何も起こりませんでした。サーバーログにリクエストはありません。 – akowalz

関連する問題