Как выполнять метод каждую секунду в фоновом потоке, чтобы он не влиял на производительность приложения - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь получить доступ к своей базе данных каждые 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 голосов
/ 26 декабря 2018

Вы можете попробовать с приведенным ниже кодом.

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")
        }
    }
}
0 голосов
/ 26 декабря 2018

Вы можете просто запустить таймер непосредственно в фоновой очереди, используя 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
}

Используя Timer, вы планируете его в цикле выполнения основной очереди, а затем отправляетеЗадача в фоновую очередь, а затем отправить обновления пользовательского интерфейса / модели обратно в основную очередь.Использование таймера диспетчеризации, как описано выше, обходит этот первый шаг, запуская таймер непосредственно в фоновой очереди GCD.

0 голосов
/ 26 декабря 2018

Использование Grand Central Dispatch:

DispatchQueue.global(qos: .background).async {
    getDatabaseInfo()
}
...