Exporting: Export to zip in a background thread
Signed-off-by: Roopesh Chander <roop@roopc.net>
This commit is contained in:
parent
1dac181803
commit
6bb25782c1
|
@ -76,17 +76,17 @@ class SettingsTableViewController: UITableViewController {
|
||||||
|
|
||||||
let count = tunnelsManager.numberOfTunnels()
|
let count = tunnelsManager.numberOfTunnels()
|
||||||
let tunnelConfigurations = (0 ..< count).compactMap { tunnelsManager.tunnel(at: $0).tunnelConfiguration() }
|
let tunnelConfigurations = (0 ..< count).compactMap { tunnelsManager.tunnel(at: $0).tunnelConfiguration() }
|
||||||
do {
|
ZipExporter.exportConfigFiles(tunnelConfigurations: tunnelConfigurations, to: destinationURL) { [weak self] (error) in
|
||||||
try ZipExporter.exportConfigFiles(tunnelConfigurations: tunnelConfigurations, to: destinationURL)
|
if let error = error {
|
||||||
} catch (let error) {
|
|
||||||
ErrorPresenter.showErrorAlert(error: error, from: self)
|
ErrorPresenter.showErrorAlert(error: error, from: self)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let activityVC = UIActivityViewController(activityItems: [destinationURL], applicationActivities: nil)
|
let activityVC = UIActivityViewController(activityItems: [destinationURL], applicationActivities: nil)
|
||||||
// popoverPresentationController shall be non-nil on the iPad
|
// popoverPresentationController shall be non-nil on the iPad
|
||||||
activityVC.popoverPresentationController?.sourceView = sourceView
|
activityVC.popoverPresentationController?.sourceView = sourceView
|
||||||
activityVC.popoverPresentationController?.sourceRect = sourceView.bounds
|
activityVC.popoverPresentationController?.sourceRect = sourceView.bounds
|
||||||
present(activityVC, animated: true)
|
self?.present(activityVC, animated: true)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func showErrorAlert(title: String, message: String) {
|
func showErrorAlert(title: String, message: String) {
|
||||||
|
|
|
@ -8,12 +8,14 @@ enum ZipExporterError: Error {
|
||||||
}
|
}
|
||||||
|
|
||||||
class ZipExporter {
|
class ZipExporter {
|
||||||
static func exportConfigFiles(tunnelConfigurations: [TunnelConfiguration], to destinationURL: URL) throws {
|
static func exportConfigFiles(tunnelConfigurations: [TunnelConfiguration], to url: URL, completion: @escaping (Error?) -> Void) {
|
||||||
|
|
||||||
guard (!tunnelConfigurations.isEmpty) else { throw ZipExporterError.noTunnelsToExport }
|
|
||||||
|
|
||||||
|
guard (!tunnelConfigurations.isEmpty) else {
|
||||||
|
completion(ZipExporterError.noTunnelsToExport)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
DispatchQueue.global(qos: .userInitiated).async {
|
||||||
var inputsToArchiver: [(fileName: String, contents: Data)] = []
|
var inputsToArchiver: [(fileName: String, contents: Data)] = []
|
||||||
|
|
||||||
var lastTunnelName: String = ""
|
var lastTunnelName: String = ""
|
||||||
for tunnelConfiguration in tunnelConfigurations {
|
for tunnelConfiguration in tunnelConfigurations {
|
||||||
if let contents = WgQuickConfigFileWriter.writeConfigFile(from: tunnelConfiguration) {
|
if let contents = WgQuickConfigFileWriter.writeConfigFile(from: tunnelConfiguration) {
|
||||||
|
@ -23,6 +25,13 @@ class ZipExporter {
|
||||||
lastTunnelName = name
|
lastTunnelName = name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
try ZipArchive.archive(inputs: inputsToArchiver, to: destinationURL)
|
do {
|
||||||
|
try ZipArchive.archive(inputs: inputsToArchiver, to: url)
|
||||||
|
} catch (let e) {
|
||||||
|
DispatchQueue.main.async { completion(e) }
|
||||||
|
return
|
||||||
|
}
|
||||||
|
DispatchQueue.main.async { completion(nil) }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue