0

Promisekit と Alamofire で while ループを使用して、4 つの GET リクエストをチェーンし、値を返し、新しいパラメーターで 4 つのリクエストを再実行しようとしています。これは私が使用している現在のコードです:

        var index = 0
        var count = classDictionary["class"]!.count-1

        while index <= count {

        firstly {
            parseBooksXML(index)
            }.then { abrevCode in
                self.parseBooksXML2(index, key: abrevCode)
            }.then { courseNumber in
                self.parseBooksXML3(index, key: courseNumber)
            }.then { instructorCode in
                self.parseBooksXML4(instructorCode)
            }
            index += 1
        }

最初の 3 つの関数はそれぞれ約束された文字列値を返します。この値は次の関数に渡され、最後の 4 番目の関数が別の関数を呼び出して、Kanna を使用してダウンロードされた HTML を解析します。

理想的には、4 つの関数すべてを呼び出して完了した後、インデックスをインクリメントし、新しいインデックス番号を使用してループを再度実行したいと考えています。注意として、配列内のどのインデックスと値を比較するかを識別する方法として、インデックスが関数に渡されます。

わかりやすくするために、以下に parseBooksXML 関数のコードを含めました。

func parseBooksXML(index: Int) -> Promise<String> {
    return Promise {fulfill, reject in

    let headers = [
        "Referer": "URL"
    ]


    Alamofire.request(.GET, "URL", headers: headers)
        .responseData { response in

            switch response.result {
            case .Success:
                let xml = SWXMLHash.parse(response.data!)

                do {

                    let range = self.classDictionary["class"]![index].rangeOfString("[a-zA-Z]{2,4}", options: .RegularExpressionSearch)
                    let result = self.classDictionary["class"]![index].substringWithRange(range!)

                    try self.abrevCode = (xml["departments"]["department"].withAttr("abrev", result).element!.attribute(by: "id")!.text)

                }
                catch {
                    print("Error: \(error)")

                }
                fulfill(self.abrevCode)

            case .Failure(let error):
                print(error)
            }
        }
    }
}

func parseBooksXML2(index: Int, key: String) -> Promise<String> {
    return Promise {fulfill, reject in

        let headers = [
        "Referer": "URL"
    ]


    Alamofire.request(.GET, "URL", headers: headers)
        .responseData { response in

            switch response.result {
            case .Success:
                let xml = SWXMLHash.parse(response.data!)
                 do {

                    let range = self.classDictionary["class"]![index].rangeOfString("\\d\\d\\d", options: .RegularExpressionSearch)
                    let result = self.classDictionary["class"]![index].substringWithRange(range!)

                    try self.courseNumber = (xml["courses"]["course"].withAttr("name", result).element?.attribute(by: "id")?.text)!

                 }
                 catch {
                    print("Error: \(error)")

                }
                fulfill(self.courseNumber)

            case .Failure(let error):
                print(error)
            }

        }
    }
}

func parseBooksXML3(index: Int, key: String) -> Promise<String> {
    return Promise {fulfill, reject in

        let headers = [
        "Referer": "URL"
    ]

    Alamofire.request(.GET, "URL", headers: headers)
        .responseData { response in

            switch response.result {
            case .Success:
                let xml = SWXMLHash.parse(response.data!)
                do {

                    let range = self.classDictionary["class"]![index].rangeOfString("[a-zA-Z]{1,3}?\\d?\\d?\\d?$", options: .RegularExpressionSearch)
                    let result = self.classDictionary["class"]![index].substringWithRange(range!)

                    try self.instructorCode = (xml["sections"]["section"].withAttr("instructor", self.classTeacher[index]).element?.attribute(by: "id")?.text)!
                }
                catch {
                    print("Error: \(error)")


                }
                fulfill(self.instructorCode)

            case .Failure(let error):
                print(error)
            }

        }
    }
}

func parseBooksXML4(key: String) -> Void {

        let headers = [
        "Referer": "URL"
    ]

    Alamofire.request(.GET, "URL", headers: headers)
        .responseData { response in

            switch response.result {
            case .Success:
                self.parseISBN(String(data: response.data!, encoding: NSUTF8StringEncoding)!)

            case .Failure(let error):
                print(error)
            }

        }
    }

どんな助けでも大歓迎です!

4

2 に答える 2

2

使用する必要がありますwhen

let count = classDictionary["class"]!.count-1

let promises = (0..<count).map { index -> Promise<ReplaceMe> in
    return firstly {
        parseBooksXML(index)
    }.then { abrevCode in
        self.parseBooksXML2(index, key: abrevCode)
    }.then { courseNumber in
        self.parseBooksXML3(index, key: courseNumber)
    }.then { instructorCode in
        self.parseBooksXML4(instructorCode)
    }
}

when(fulfilled: promises).then {
    //…
}
于 2016-09-12T06:43:20.240 に答える
0

parseBooksXML4 呼び出しは非同期であるため、parseBooksXML4() 呼び出しをラップして promise を返し、それが完了するまで待ってからインデックスをインクリメントする必要があります。

    firstly {
        parseBooksXML(index)
        }.then { abrevCode in
            self.parseBooksXML2(index, key: abrevCode)
        }.then { courseNumber in
            self.parseBooksXML3(index, key: courseNumber)
        }.then { instructorCode in
            self.parseBooksXML4(instructorCode)
        }.then { _ in
            index += 1
        }
    }
于 2016-09-11T19:37:53.740 に答える