web-dev-qa-db-ja.com

AFNetworkingとSwift

Swiftを使用してJSON応答を取得しようとしています。

リクエストとレスポンスをスニッフィングしました->すべて問題ありません。ただし、戻り値は常にnilです。

let httpClient = AppDelegate.appDelegate().httpRequestOperationManager as AFHTTPRequestOperationManager;

let path = "/daten/wfs";
let query = "?service=WFS&request=GetFeature&version=1.1.0&typeName=ogdwien:AMPELOGD&srsName=EPSG:4326&outputFormat=json".stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding);

func successBlock(operation: AFHTTPRequestOperation!, responseObject: AnyObject!) {
    println("JSON: " + "\(responseObject)")
}

func errorBlock(operation: AFHTTPRequestOperation!, error:NSError!) {
    println("Error: " + error.localizedDescription)
}

let urlString = "\(path)" + "/" + "\(query)"
println("urlString: " + httpClient.baseURL.absoluteString + urlString)

私もこの方法で試しました:

httpClient.GET(urlString, parameters: nil,
    success: { (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) -> Void in
        println("Success")
        println("JSON: " + "\(responseObject)")
    },
    failure:{ (operation: AFHTTPRequestOperation!, error:NSError!) -> Void in
        println("Failure")
    })

...しかし、responseObjectは常にnilのようです

編集:

おそらくその理由は、私のAppDelegateの初期化が間違っている可能性があることです。

var httpRequestOperationManager: AFHTTPRequestOperationManager? // Java SERVER Client

class func appDelegate() -> AppDelegate {
    return UIApplication.sharedApplication().delegate as AppDelegate
}

func configureWebservice() {
    let requestSerializer = AFJSONRequestSerializer()
    requestSerializer.setValue("1234567890", forHTTPHeaderField: "clientId")
    requestSerializer.setValue("Test", forHTTPHeaderField: "appName")
    requestSerializer.setValue("1.0.0", forHTTPHeaderField: "appVersion")

    let responseSerializer = AFJSONResponseSerializer()

    AFNetworkActivityIndicatorManager.sharedManager().enabled = true

    // ##### HTTP #####
    let baseURL = NSURL(string: "http://data.wien.gv.at");
    httpRequestOperationManager = AFHTTPRequestOperationManager(baseURL: baseURL))

    httpRequestOperationManager!.requestSerializer = requestSerializer
    httpRequestOperationManager!.responseSerializer = responseSerializer
}

私が間違っていることについて何か提案はありますか?

14
user707342

SwiftはObjective-Cコードと完全に互換性があるため、問題はnotSwift自体に接続されていません。AFNetworkingresponseObjectcannilになる場合があります。これには、次の場合が含まれます。

  • A 204 No Contentステータスコードが返されました、
  • 出力ストリームがファイルに書き込むように設定されている場合、
  • 検証中のエラーがNSURLErrorCannotDecodeContentDataではなかった場合(例:許容できないコンテンツタイプ)

詳細については、 #74 および #128 を確認してください。

8
akashivskyy

SwiftのObjective-Cフレームワークとの相互運用性を使用できますが、公式ライブラリがあります。チェックしてみましょう。

https://github.com/Alamofire/Alamofire

このライブラリは、AFNetworkingの作成者によるネイティブSwiftで作成されています。 Swiftに移行するときは、おそらくこの種のものを探したいと思うでしょう。私はそれを試してみました、そしてそれはその前任者のように素晴らしいです。

6
Thiem Nguyen