0

我正在使用 Alamofire 从 Web 服务器下载五个 XML 文件,并使用 SWXMLHash 解析它们。最后一个文件依赖于前四个文件,其某些条目引用前四个中包含的条目。我对下载代码使用级联样式结构,以确保在开始下载最后一个文件之前下载所有四个文件。

    let destination: DownloadRequest.DownloadFileDestination = { _, _ in
        let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory,
                                                                .userDomainMask, true)[0]
        let documentsURL = URL(fileURLWithPath: documentsPath, isDirectory: true)
        let fileURL = documentsURL.appendingPathComponent("image.png")

        return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
    }



    // Download Category files
    Alamofire.download(self.ottawaOpenDataCategoriesURL, to:
        destination)
        .downloadProgress { progress in
            //print("Download Progress for Category: \(progress.fractionCompleted)")
            if let pv = self.progressViewController {
               pv.updateProgress(progress.fractionCompleted * 100.0) //Alamofire returns 1 for complete process
            }
        }

        .responseData { response in
            // Check 304 response to see if new file is available
            if response.response?.statusCode == self.HTTP_STATUS_FILE_NOT_CHANGE {
                return
            }

            if let data = response.result.value {
                let xml = self.initXMLParser(data: data)
                self.storeCategoryXMLStream(xml)
            }


            // After complete downloading or get error, try download Options
            Alamofire.download(self.ottawaOpenDataOptionsURL, to:
                destination)
                .downloadProgress { progress in
                    if let pv = self.progressViewController {
                        pv.updateProgress(progress.fractionCompleted * 100.0) //Alamofire returns 1 for complete process
                    }
                }

                .responseData { response in
                    // Check 304 response to see if new file is available
                    if response.response?.statusCode == self.HTTP_STATUS_FILE_NOT_CHANGE {
                        return
                    }

                    if let data = response.result.value {
                        let xml = self.initXMLParser(data: data)
                        self.storeEventOptionsXMLStream(xml)
                    }

                    // After complete downloading or get error, try download Locations
                    Alamofire.download(self.ottawaOpenDataLocationsURL,  to:
                        destination)
                        .downloadProgress { progress in
                            if let pv = self.progressViewController {
                                pv.updateProgress(progress.fractionCompleted * 100.0) //Alamofire returns 1 for complete process
                            }
                        }

                        .responseData { response in
                            // Check 304 response to see if new file is available
                            if response.response?.statusCode == self.HTTP_STATUS_FILE_NOT_CHANGE {
                                return
                            }

                            if let data = response.result.value {
                                let xml = self.initXMLParser(data: data)
                                self.storeVenuesXMLStream(xml)
                            }

                            // After complete downloading or get error, try download CitrSectors
                            Alamofire.download(self.ottawaOpenDataCitySectorsURL,  to:
                                destination)
                                .downloadProgress { progress in
                                    if let pv = self.progressViewController {
                                        pv.updateProgress(progress.fractionCompleted * 100.0) //Alamofire returns 1 for complete process
                                    }
                                }

                                .responseData { response in
                                    // Check 304 response to see if new file is available
                                    if response.response?.statusCode == self.HTTP_STATUS_FILE_NOT_CHANGE {
                                        return
                                    }

                                    if let data = response.result.value {
                                        let xml = self.initXMLParser(data: data)
                                        self.storeCitySectorsXMLStream(xml)
                                    }


                                    // After complete downloading or get error, try download events
                                    Alamofire.download(self.ottawaOpenDataEventsURL, to:
                                        destination)
                                        .downloadProgress { progress in
                                            if let pv = self.progressViewController {
                                                pv.updateProgress(progress.fractionCompleted * 100.0) //Alamofire returns 1 for complete process
                                            }
                                        }

                                        .responseData { response in
                                            // Check 304 response to see if new file is available
                                            if response.response?.statusCode == self.HTTP_STATUS_FILE_NOT_CHANGE {
                                                return
                                            }

                                            if let data = response.result.value {
                                                let xml = self.initXMLParser(data: data)
                                                self.storeEventsXMLStream(xml)
                                            }

                                        }
                                }
                        }
                }

        }

如您所见,每个下载段都等待前一个下载段完成。此外,进度条会在下载过程中更新。大多数 XML 文件的大小从小到大(80 行 - 10K 行),最后一个是最大的,包含大约 200K 行。

我不确定是不是因为级联样式结构,但是下载和解析前四个文件大约需要 10 秒。有没有可能让它更快?我只是想知道我是否可以提高效率。这是cpu使用和mem使用的截图。

在此处输入图像描述

PS我在模拟器上运行这个应用程序。

4

1 回答 1

1

由于前 4 个下载不是相互依赖的,因此您可以同时下载它们,并且只有在收到所有 4 个时才开始第 5 次下载。使用调度组同步执行第 5 次下载。

简而言之,整个操作如下所示:

let group = DispatchGroup()

group.enter()
Alamofire.download(first url).responseData {
    process first url
    group.leave()
}

group.enter()
Alamofire.download(second url).responseData {
    process second url
    group.leave()
}

repeat for third and fourth url

group.notify(queue:Dispatch.main) {
    Alamofire.download(fifth url).responseData {
        process 5th url
    }
}
于 2017-03-21T04:39:07.907 回答