ios - 提高下载多个 XML 文件并解析它们的效率

标签 ios swift alamofire swxmlhash

我正在使用 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 使用情况和内存使用情况的屏幕截图。

enter image description here

P.S 我在模拟器上运行这个应用程序。

最佳答案

由于前 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
    }
}

关于ios - 提高下载多个 XML 文件并解析它们的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42918440/

相关文章:

ios - AWS ios SDK - 将对象上传到AWS S3

ios - SceneKit – SCNCamera 自上而下 View

swift - @AppStorage 不更新 View

iOS 12.4.1 发布导致 iPad 设备被苹果商店拒绝崩溃

ios - 使用 Alamofire 的 POST 请求时设置为参数的对象数组

android - 如何强制应用程序增加媒体声音而不是通话声音

ios - StackView isHidden 属性未按预期更新

ios - 设置选项 View 属性的属性时出现 EXC_BAD_ACCESS

ios - 使用 Alamofire 从 url 下载后确定文件类型

iOS ARKit ARFaceAnchor 导出到具有实际面部尺寸的 3D 模型文件?