如何每秒在后台线程上执行一种方法,以免影响应用程序的性能

时间:2018-12-26 06:14:02

标签: swift timer background-thread

我试图每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()方法,以便不损害应用程序的性能。

3 个答案:

答案 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后台队列上运行计时器。