Я этот метод:Невозможно выполнить действия в фоновом режиме и обновить progressView в mainThread
func stepThree() {
operation = "prDatas"
let entries = self.data.componentsSeparatedByString("|***|")
total = entries.count
for entry in entries {
++current
dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), {
self.registerDB(entry)
})
}
status.setProgress(Float(current/total), animated: true)
finishAll()
}
Я хочу, чтобы выполнить registerDB
функцию и обновить ProgressBar при завершении. я тестировал несколько путь, но никогда не удастся
EDIT 1
Реализация @Russell предложение, отлично работать, но вычисления значения внутри dispatch_async блока всегда приводит к 0
Есть вопрос о операций и многопоточности?
метод:
func stepThree() {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
var current = 0
var total = 0
self.operation = "prDatas"
let entries = self.data.componentsSeparatedByString("|***|")
total = entries.count
for entry in entries {
++current
self.registerDB(entry)
dispatch_async(dispatch_get_main_queue(), {
print("value of 'current' is :" + String(current))
print("value of 'total' is :" + String(total))
print("Result is : " + String(Float(current/total)))
self.updateV(Float(current/total))
})
}
})
}
Консоль вывода:
value of 'current' is :71
value of 'total' is :1328
Result is : 0.0
Float (текущий/всего) ваша проблема - расчет делается первый - с целыми числами - а затем результат (который всегда равен 0) преобразуется в Float. У меня была такая же проблема в моем решении, и именно поэтому я преобразовал оба параметра в float first – Russell
Это работает лучше, спасибо еще раз! – Khorwin