I'm banging my head trying to figure this out and I feel like I am missing something here. I am trying to illeterate through a loop in order and then send a request to php to update my database. The problem is the code keeps inserting the lines at random.
Here is the latest I have tried which I found online to try and use DispatchGroup, in my viewcontroller I have this function
private let myGroup = DispatchGroup()
@IBAction func submitBtn(_ sender: Any) {
if GlobalVars.isSearching { return }
print("Sending SQL Update for Work Order \(lblWorkOrder.text ?? "") ")
//Convert string to html style for Spectrum
let existingLines = txtNotes.text.components(separatedBy: CharacterSet.newlines)
txtNotes.text = ""
for (index, element) in existingLines.enumerated() {
myGroup.enter()
let newln = "<p>\(element)</p>"
self.txtNotes.text += newln
var final = String(0)
var partial = String(1)
if (index == element.count - 1) {
final = String(1)
} else if index == 0 {
partial = String(0)
}
workOrders.sqlUpdateWorkorder(self.lblEquipment.text, WO: self.lblWorkOrder.text, Notes: newln, Meter: self.txtMeter.text, User: UIDevice.current.name, Type: self.Unit?.meterType, Partial: partial, Final: final, Line: String(index))
}
}which calls to this delegate function
func sqlUpdateWorkorder(_ Unit: String?, WO: String?, Notes: String?, Meter: String?, User: String?, Type: String?, Partial: String?, Final: String?, Line: String?) {
var components = URLComponents(string: GlobalVars.phpFile)
let param1 = URLQueryItem(name: "cmd", value: "UpdateWorkOrder")
let param2 = URLQueryItem(name: "unit", value: Unit)
let param3 = URLQueryItem(name: "wo", value: WO)
let param4 = URLQueryItem(name: "notes", value: Notes)
let param5 = URLQueryItem(name: "meter", value: Meter)
let param6 = URLQueryItem(name: "user", value: User)
let param7 = URLQueryItem(name: "type", value: Type)
let param8 = URLQueryItem(name: "part", value: Partial)
components?.queryItems = [param1, param2, param3, param4, param5, param6, param7, param8]
guard let url: URL = (components?.url) else {
print("Failed to get url from components.")
return
}
GlobalVars.submitOnlineQuery(url: url, bgtask: false) { data, error in
if error != nil {
self.delegate?.workOrderUpdated(Success: "0")
} else {
guard let data = data else {
GlobalVars.showAlert(msg: "Error getting data, no data returned from server.", title: "Error!", vc: GlobalVars.topViewController()!, dismiss: true)
print("Error: No data to decode")
return
}
let responseString = String(data: data, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue))
if Final == "1" {
self.delegate?.workOrderUpdated(Success: responseString ?? "0")
} else {
self.delegate?.workOrderUpdated(Success: "Part \(Line ?? "0")")
}
}
}
}Which calls to a global function
static func submitOnlineQuery(url: URL, bgtask: Bool, completionHandler: @escaping (Data?, Error?) -> Swift.Void) {
GlobalVars.isSearching = true
if ( !bgtask ) {
// add the spinner view controller
let child = SpinnerViewController()
child.view.frame = (self.topViewController()?.view.frame)!
self.topViewController()?.view.addSubview(child.view)
// add slow connection label if needed
let myLabel = connectionLabel(frame: CGRect(x: 0, y: 0, width: 200, height: 21))
let task = DispatchWorkItem {
myLabel.blink()
self.topViewController()?.view.addSubview(myLabel)
}
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 5.0, execute: task)
guard GlobalVars.isOnline == true else {
GlobalVars.showAlert(msg: "No internet connection, please try again.", title: "Error: No Network!", vc: (self.topViewController())!, dismiss: false)
self.stopSpinner(child: child, label: myLabel, task: task)
completionHandler(nil, myError.noConnection)
return
}
// try to download data as requested
URLSession.shared.dataTask(with: url) { (data, response, error) in
if error != nil {
print("Failed to download data")
self.stopSpinner(child: child, label: myLabel, task: task)
completionHandler(data, error)
}else {
guard let data = data else {
print("Error: No data to decode")
self.stopSpinner(child: child, label: myLabel, task: task)
completionHandler(nil, myError.noData)
return
}
print("Successfully queried URL")
self.stopSpinner(child: child, label: myLabel, task: task)
completionHandler(data, error)
}
}.resume()
} else {
DispatchQueue.global(qos: .background).async {
// try to download data as requested
URLSession.shared.dataTask(with: url) { (data, response, error) in
if error != nil {
print("BGTask => Failed to download data")
GlobalVars.isSearching = false
completionHandler(data, error)
}else {
guard let data = data else {
print("BGTask => Error: No data to decode")
GlobalVars.isSearching = false
completionHandler(nil, myError.noData)
return
}
print("BGTask => Successfully queried URL")
GlobalVars.isSearching = false
completionHandler(data, error)
}
}.resume()
}
}Then upon retreival in my viewcontroller this is my delegate return
func workOrderUpdated(Success: String) {
myGroup.leave()
if (Success.contains("Part")) {
print("Successfully added \(Success)")
} else {
GlobalVars.showAlert(msg: Success, title: "Update Status", vc: self, dismiss: true)
}
}This is the result
Sending SQL Update for Work Order 11835
Successfully queried URL
Successfully added Part 0
Successfully queried URL
Successfully added Part 4
Successfully queried URL
Successfully added Part 1
Successfully queried URL
Successfully added Part 3
Successfully queried URL
Successfully added Part 7
Successfully queried URL
Successfully added Part 8
Successfully queried URL
Successfully added Part 9
Successfully queried URL
Successfully added Part 5
Successfully queried URL
Successfully added Part 6
Successfully queried URL
Successfully added Part 2