我试图每30秒访问一次数据库,但是,只要执行该方法,我就可以清楚地看到应用程序的性能下降。
到目前为止,这是我当前的代码:
var timer = Timer()
override func viewDidLoad() {
super.viewDidLoad()
scheduledTimerWithTimeInterval()
}
func scheduledTimerWithTimeInterval(){
timer = Timer.scheduledTimer(timeInterval: 30, target: self, selector: #selector(self.updateCounting), userInfo: nil, repeats: true)
}
@objc func updateCounting(){
getDatabaseInfo()
}
我想做同样的事情,除了我想在后台线程上执行getDatabaseInfo()方法,以便不损害应用程序的性能。
答案 0 :(得分:3)
使用Grand Central Dispatch:
DispatchQueue.global(qos: .background).async {
getDatabaseInfo()
}
答案 1 :(得分:2)
您可以尝试以下代码。
var timer = Timer()
override func viewDidLoad() {
super.viewDidLoad()
scheduledTimerWithTimeInterval()
}
func scheduledTimerWithTimeInterval(){
timer = Timer.scheduledTimer(timeInterval: 30, target: self, selector: #selector(self.updateCounting), userInfo: nil, repeats: true)
}
@objc func updateCounting(){
DispatchQueue.global(qos: .background).async {
print("This is run on the background queue")
getDatabaseInfo()
DispatchQueue.main.async {
print("This is run on the main queue, after the previous code in outer block")
}
}
}
答案 2 :(得分:0)
您可以使用def cart_detail(request):
cart = Cart(request)
for item in cart:
item['update_quantity_form'] = CartAddProductForm(initial={'quantity': item['quantity'], 'update': True})
return render(request, 'cart/detail.html', {'cart': cart})
直接在后台队列上运行计时器:
DispatchSourceTimer
使用private var timer: DispatchSourceTimer?
func startTimer() {
let queue = DispatchQueue(label: Bundle.main.bundleIdentifier! + ".timer")
timer = DispatchSource.makeTimerSource(queue: queue)
timer!.schedule(deadline: .now(), repeating: .seconds(1))
timer!.setEventHandler { [weak self] in
// do whatever stuff you want on the background queue here here
getDatabaseInfo()
DispatchQueue.main.async {
// update your model objects and/or UI here
}
}
timer!.resume()
}
func stopTimer() {
timer?.cancel()
timer = nil
}
,将其调度在主队列的运行循环中,然后让它将任务分派到后台队列,然后将UI /模型更新分派回主队列。如上所述,使用分派计时器可以绕开第一步,直接在GCD后台队列上运行计时器。