2016-08-02 12 views
2

Siestaフレームワークを使用して、APIエンドポイントhttps://thecountedapi.com/api/countedにGETリクエストを行う必要があるアプリを構築しています。エンドポイントはhttps://api.github.com/users/ebelinski/reposのようなエンドポイントのようにJSON配列を返します。これはSiestaの例のGithub Browserで使用されています。その結果、私は自分のアプリがシエスタを利用するようにしようとしています。その後JSON配列を含むAPIエンドポイント用のシエスタトランスを作成するにはどうすればよいですか?

let API = Service(baseURL: "https://thecountedapi.com/api") 

application:didFinishLaunchingWithOptionsの私のエンドポイント用の変圧器:インシデントは、JSONオブジェクトにかかる初期化子を持つ構造体である

API.configureTransformer("/counted") { 
    ($0.content as JSON).arrayValue.map(Incident.init) 
} 

私は、サービスを作成します。

let resource = API.resource("/counted") 

viewDidLoadで:

はその後、私のビューコントローラでは、私はリソースを作成

resource.addObserver(self) 

viewWillAppearで:

resource.loadIfNeeded() 

その後、私は、以下の機能を持っています私のVCで変更を聞く:

func resourceChanged(resource: Resource, event: ResourceEvent) { 
    print(resource.jsonArray) 

    if let error = resource.latestError { 
    print(error.userMessage) 
    return 
    } 

    if let content: [Incident] = resource.typedContent() { 
    print("content exists") 
    incidents = content 
    } 

    print(incidents.count) 
} 

私のアプリを実行すると、結果が混乱します。 print(resource.jsonArray)[]と表示され、Cannot parse server responseというエラーメッセージが表示され、Siesta.enabledLogCategories = LogCategory.detailedと設定すると、エラーメッセージ[Siesta:StateChanges] Siesta.Resource(https://thecountedapi.com/api/counted)[] received error: Error(userMessage: "Cannot parse server response", httpStatusCode: nil, entity: nil, cause: Optional(Siesta.Error.Cause.WrongTypeInTranformerPipeline(expectedType: "JSON", actualType: "__NSCFArray", transformer: Siesta.ResponseContentTransformer<SwiftyJSON.JSON, Swift.Array<TheCountedViewer.Incident…が表示されます。

私がトランス全体をコメントアウトすると、print(resource.jsonArray)が正しい配列をエンドポイントから出力するという点でいくつか成功しています。だから私の変圧器は、何らかの方法で間違っている必要がありますが、私はGithubのブラウザのように基本的に同じ変圧器を使用していると思う:

service.configureTransformer("https://stackoverflow.com/users/*/repos") { 
    ($0.content as JSON).arrayValue.map(Repository.init) 
} 

私は何かが足りないのですか? - あなたが同じくらい言ったあなたの変圧器は理にかなってJSONの入力タイプ、予想されることを言っている

Siesta.Error.Cause.WrongTypeInTranformerPipeline 
    expectedType: "JSON" 
    actualType: "__NSCFArray" 

答えて

0

はあなたの問題への鍵手がかりは(おそらくない理想的helfpul)メッセージをログに記録し、その中に埋設されています($0.content as JSON)となります。しかし、は、の秘密の内部裏打ちタイプであるタイプ__NSCFArrayとなっています。言い換えれば、それはSwiftyJSON値を期待していましたが、代わりにNSJSONSerializationの生の出力を得ました。

なぜですか? GithubBrowserプロジェクトにはNSDict/NSArray → SwiftyJSON transformerがあり、それはconfigures in the parsing stageです。そのプロジェクトのモデルトランスはすべてそれに依存しています。その後、

private let SwiftyJSONTransformer = 
    ResponseContentTransformer 
    { JSON($0.content as AnyObject) } 

そして、あなたのサービスの設定:

プロジェクトで同じようにSwiftyJSONを使用するには、あなたはあなたの例のプロジェクトからその変圧器を含める必要があります

service.configure { 
    $0.config.pipeline[.parsing].add(SwiftyJSONTransformer, contentTypes: ["*/json"]) 
} 

(あなたがエラーに興味がある場合は、transformErrors: trueResponseContentTransformerを作成したい場合がありますので注意してください。)


ほどきれいではありませんが、あまり設定が必要SwiftyJSONを使用する別の方法は、手動で個々の応答トランスにJSONで物事をラップすることです:

service.configureTransformer("https://stackoverflow.com/users/*/repos") { 
    JSON($0.content as AnyObject).arrayValue.map(Incident.init) 
} 
関連する問題