2017-04-10 4 views
1

RxSwift 또는 유사한 프레임 워크를 사용하지 않고 반응 형 프로그래밍에서 스로틀 기능을 구현하는 간단한 방법이 있습니까?반응이없는 Swift에서의 조절

문자를 삽입하거나 삭제할 때마다 발생시키지 않는 textField 대리자 메서드가 있습니다.

바닐라 파운데이션을 사용하는 방법?

+1

대리인은 매번 발생합니다. 대리자 메서드에서 타이머를 시작할 수 있습니다. 타이머가 꺼지기 전에 대리자가 다시 시작되면 타이머를 다시 시작합니다. 타이머가 꺼지면 필요한 것을하십시오. – Paulw11

답변

2

예 가능합니다.

하지만 먼저 조절에 대해 작은 질문에 대답 할 수 있습니까? 소프트웨어

은 조임 공정 또는 그것 때때로 불리는 스로틀 제어, 정적 또는 동적으로 수행되는 애플리케이션 프로세싱 속도 조절을 담당하는 공정이다.

스위프트의 Throttling 기능의 예.

위임 메서드로 설명하는 경우 매번 위임 메서드가 호출된다는 문제가 있습니다. 그래서 당신이 설명하는 경우 어떻게 할 수 없는지에 대한 간단한 예를 쓸 것입니다.

class ViewController: UIViewController { 

    var timer: Timer? 

    @IBOutlet weak var textField: UITextField! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     textField.delegate = self 
    } 

    func validate() { 
     print("Validate is called") 
    } 
} 

extension ViewController: UITextFieldDelegate { 

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 

     timer?.invalidate() 

     timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(self.validate), userInfo: nil, repeats: false); 

     return true 
    } 

} 
+1

'timer? .validate()'는 조금 더 간단합니다. – Sulthan

+0

나는 이것이 지금 할 것이라고 생각한다. 타이머를 사용할 때의 문제점은 다음과 같습니다. 모든 새 타이머가있을 때 ** 이전 호출을 취소하지 않고 ** 선택기가 실행됩니다. 그리고 이것은 전체적인 점을 무너 뜨릴 것입니다. 그리고 실렉터에 대한 호출이 가정 된 순서에 있다고 보장 할 수는 없습니다. – Carpsen90

+0

@ Carpsen90 실제로 특정 순서로있을 필요는 없습니다. 이전 결과를 모두 무시하면됩니다. 이 작업을 수행하는 방법은 API에 따라 다릅니다. 나는 보통 컨텍스트 내부의 텍스트로 요청에 따라 일부 컨텍스트를 전달합니다. 요청이 완료되면 현재 텍스트가 요청한 텍스트와 동일한 지 비교할 수 있습니다. – Sulthan

관련 문제