Swift에서 x분마다 무언가 하기
매 분마다 기능을 실행하려면 어떻게 해야 합니까?자바스크립트에서 나는 다음과 같은 것을 할 수 있습니다.setInterval
스위프트에 비슷한 것이 존재합니까?
원하는 출력:
헬로 월드는 1분에 한번씩...
var helloWorldTimer = NSTimer.scheduledTimerWithTimeInterval(60.0, target: self, selector: Selector("sayHello"), userInfo: nil, repeats: true)
func sayHello()
{
NSLog("hello World")
}
Foundation을 가져오는 것을 기억하십시오.
스위프트 4:
var helloWorldTimer = Timer.scheduledTimer(timeInterval: 60.0, target: self, selector: #selector(ViewController.sayHello), userInfo: nil, repeats: true)
@objc func sayHello()
{
NSLog("hello World")
}
iOS 버전 10 이상을 대상으로 하는 경우 다음의 블록 기반 버전을 사용할 수 있습니다.Timer
이는 다음과 같은 강력한 잠재적 기준 주기를 단순화합니다.
weak var timer: Timer?
func startTimer() {
timer?.invalidate() // just in case you had existing `Timer`, `invalidate` it before we lose our reference to it
timer = Timer.scheduledTimer(withTimeInterval: 60.0, repeats: true) { [weak self] _ in
// do something here
}
}
func stopTimer() {
timer?.invalidate()
}
// if appropriate, make sure to stop your timer in `deinit`
deinit {
stopTimer()
}
하는 동안에Timer
일반적으로 완전성을 위해 백그라운드 스레드에서 타이머를 예약하는 데 유용한 디스패치 타이머도 사용할 수 있습니다.디스패치 타이머는 블록 기반이기 때문에 기존 시스템에서 발생하는 강력한 참조 주기 문제를 방지합니다.target
/selector
의 패턴.Timer
사용하는 한weak
참고 문헌
그래서:
var timer: DispatchSourceTimer?
func startTimer() {
let queue = DispatchQueue(label: "com.domain.app.timer") // you can also use `DispatchQueue.main`, if you want
timer = DispatchSource.makeTimerSource(queue: queue)
timer!.schedule(deadline: .now(), repeating: .seconds(60))
timer!.setEventHandler { [weak self] in
// do whatever you want here
}
timer!.resume()
}
func stopTimer() {
timer = nil
}
자세한 내용은 동시성 프로그래밍 안내서의 디스패치 소스 섹션에 있는 디스패치 소스 예제의 타이머 만들기 섹션을 참조하십시오.
Swift 2의 경우 이 답변의 이전 개정판을 참조하십시오.
시간이 조금 걸릴 경우 다음과 같은 간단한 솔루션이 매 분마다 일부 코드를 실행합니다.
private func executeRepeatedly() {
// put your code here
DispatchQueue.main.asyncAfter(deadline: .now() + 60.0) { [weak self] in
self?.executeRepeatedly()
}
}
그냥 도망가executeRepeatedly()
1분마다 실행됩니다.소유 개체가 다음과 같을 때 실행이 중지됩니다.self
)가 공개되었습니다.플래그를 사용하여 실행을 중지해야 함을 나타낼 수도 있습니다.
다음은 에 대한 업데이트입니다.NSTimer
스위프트 3에 대한 답변(그 안에서)NSTimer
로 이름이 변경되었습니다.Timer
) 명명된 함수가 아닌 폐쇄를 사용합니다.
var timer = Timer.scheduledTimer(withTimeInterval: 60, repeats: true) {
(_) in
print("Hello world")
}
사용할 수 있습니다.Timer
(3인치)
var timer = Timer.scheduledTimerWithTimeInterval(60, target: self, selector: Selector("function"), userInfo: nil, repeats: true)
선택기()에 함수 이름을 입력합니다.
swift 3.0에서는 GCD가 리팩터링되었습니다.
let timer : DispatchSourceTimer = DispatchSource.makeTimerSource(flags: [], queue: DispatchQueue.main)
timer.scheduleRepeating(deadline: .now(), interval: .seconds(60))
timer.setEventHandler
{
NSLog("Hello World")
}
timer.resume()
이 기능은 특정 대기열에서 발송해야 하는 경우에 특히 유용합니다.또한 사용자 인터페이스 업데이트에 이 기능을 사용할 계획이라면 다음과 같은 기능을 사용할 것을 제안합니다.CADisplayLink
GPU 리프레시 속도와 동기화되기 때문입니다.
다음은 다른 버전의 Algrid가 쉽게 막을 수 있는 방법입니다.
@objc func executeRepeatedly() {
print("--Do something on repeat--")
perform(#selector(executeRepeatedly), with: nil, afterDelay: 60.0)
}
다음은 시작 및 중지 방법의 예입니다.
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
executeRepeatedly() // start it
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
NSObject.cancelPreviousPerformRequests(withTarget: self) // stop it
}
timer = Timer.scheduledTimer(withTimeInterval: 60, repeats: true, block: myMethod)
func myMethod(_:Timer) {
...
}
또는
timer = Timer.scheduledTimer(withTimeInterval: 60, repeats: true) { _ in
...
}
당신의 시간이 더 이상 보이지 않거나 당신의 물체가 먼지가 있는 것과 같은 시점에서 타이머를 무효로 해야 합니다.
언급URL : https://stackoverflow.com/questions/25951980/do-something-every-x-minutes-in-swift
'programing' 카테고리의 다른 글
AJAX 응답을 기다리는 동안 이미지를 로드하려면 어떻게 해야 합니까? (0) | 2023.08.14 |
---|---|
동일한 사이트 cookie 속성으로 CSRF 차단 (0) | 2023.08.14 |
가장 느린 쿼리를 찾는 방법 (0) | 2023.08.14 |
배열 길이를 세고 요소가 하나만 포함된 경우 1을 반환합니다. (0) | 2023.08.14 |
event.target과 함께 사용할 수 있는 속성은 무엇입니까? (0) | 2023.08.14 |