0

Foursquare のPhotos From a Venueと Foursquare のExploreに同時に GET リクエストを送信しようとしています。現在 (間違っている場合は訂正してください)、Alamofire を介して要求を行い、SwiftyJSON を使用して応答を JSON オブジェクトに変換する 2 つの方法があります。

以下の makeRequest() を使用してデータを反映するように UITableViewCell のラベルを正常に更新できますが、それぞれのセルの背景写真の UIImage を更新できません。

私の問題は、A) 使用可能な写真の URL を取得すること、および B) 2 つの別々の要求からデータを提供しながら「ピン」を初期化することです。ピンを初期化するには、すべての値を設定する必要があります。あるリクエストから値の 90% を取得し、別のリクエストから 10% (取得する必要がある写真の URL) を取得しています。2 つの別々のリクエストからのデータで「ピン」を初期化するにはどうすればよいですか?

makeImageRequest :

    func makeImageRequest() {

    let venueID = "43695300f964a5208c291fe3"
    let firstURL = "https://api.foursquare.com/v2/venues/\(venueID)/photos"

    Alamofire.request(.GET, firstURL, parameters: [
        "client_id" : foursquareClientID,
        "client_secret" : foursquareClientSecret,
        "v" : "20140806",
        "m" : "foursquare",
        "limit" : "10"
        ])
        .responseJSON { (request, response, data, error) in
            println(request)
            println(response)
            println(error)

            let jsonObj = JSON(data!)
            self.pins = []
            for obj in jsonObj["response"]["photos"]["items"].arrayValue {
                let photoURL = obj["prefix"]["suffix"].stringValue
                println("the photo url is\(photoURL)")
                let pin = Pin(title: obj["venue"]["name"].stringValue, openUntil: obj["venue"]["hours"]["status"].stringValue, address: obj["venue"]["location"]["address"].stringValue, ratingSignals: obj["venue"]["ratingSignals"].stringValue, ratingImage: UIImage(named:"Score8-5")!, venueImage: UIImage(named: "FloraGrubTestImage.jpg")!)
                self.pins.append(pin)
            }
            self.tableView.reloadData()

    }
}

そしてmakeRequest

    func makeRequest(searchString: String) {

    let secondURL = "https://api.foursquare.com/v2/venues/explore"

    Alamofire.request(.GET, secondURL, parameters: [
        "client_id" : foursquareClientID,
        "client_secret" : foursquareClientSecret,
        "ll" : "37.71987,-122.470089",
        "query" : searchString,
        "radius" : "1000",
        "limit" : "10",
        "v" : "20140806",
        "m" : "foursquare"
        ])
        .responseJSON { (request, response, data, error) in
            println(request)
            println(response)
            println(error)

            let jsonObj = JSON(data!)
            self.pins = []
            println(jsonObj)
            for obj in jsonObj["response"]["groups"][0]["items"].arrayValue {
                let pin = Pin(title: obj["venue"]["name"].stringValue, openUntil: obj["venue"]["hours"]["status"].stringValue, address: obj["venue"]["location"]["address"].stringValue, ratingSignals: obj["venue"]["ratingSignals"].stringValue, ratingImage: UIImage(named:"Score8-5")!, venueImage: UIImage(named: "FloraGrubTestImage.jpg")!)
                self.pins.append(pin)
            }
            self.tableView.reloadData()
    }
}

UITableViewCell クラスに別の bindData() メソッドがあります。これは理にかなっていますか?誰でも私を助けることができますか?

更新:私が一緒に働いているエンジニアは、同じメソッド makeRequest 内で別のリクエストを作成し、それを 2 つの別々のメソッドに分割することを気にしないことを提案しました。また、ある種の応答ルーターを提案するチュートリアルをオンラインで読みました。このコードを 1 つのメソッドにリファクタリングする方法について何か提案はありますか?

更新#2:元の質問が私の本当の問題ではないことに気付いたので、この質問の名前を変更しました

4

1 に答える 1

1

最も簡単な方法は、これらのリクエストを連続して実行することです。最初にすべてのピンを取得してから、すべての写真を取得します。これは基本的に、他のエンジニアがアドバイスしたことです。

これらのリクエストを並行して起動すると、どのリクエストが最初に返されるかわからないため、レスポンスをマージするために余分な作業が必要になります。

ピンをマージするには、各ピンを一意に識別する方法が必要です。身分証明書があれば、それを使用できます。それ以外の場合は、並べ替え順序とインデックスに依存する必要があります。各リクエストが同じピンを同じ順序で返すと仮定します。

最初のリクエストが返されると、ピンの配列が得られます。次に、2 番目のリクエスト コールバックで、この配列から一致するピンを取得し、新しいデータで更新できます。

于 2015-03-18T19:07:56.483 に答える