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