2016-12-23 25 views
5

Tôi đã cố gắng để tận dụng hẹn giờ trong Swift và tôi đã đơn giản hóa nó thành phố như sau:Swift 3 hẹn giờ không bắn

func startTimer() { 
    timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(ViewController.test), userInfo: nil, repeats: true) 
} 
func test() { 
    print("FIRED") 
} 

Tôi muốn gọi đây là từ chức năng khác và đã xác minh startTimer chức năng hoạt động, nhưng bộ hẹn giờ không kích hoạt. Điều này có liên quan đến RunLoop không? Tôi khá mới viết mã nên mọi lời giải thích sẽ được đánh giá cao.

+0

Có phải 'ViewController' ==' self' không? – vadian

+0

Từ đoạn mã, tôi cho rằng nó nên được kích hoạt, vì vậy chắc chắn về 'startTimer()' đã được gọi, phải không? và -obviously- lớp của bạn được gọi là "ViewController" –

+0

Thêm một tuyên bố in bên trong startTimer để chắc chắn rằng nó được gọi. –

Trả lời

12

Thực hành tốt: Trong startTimer() kiểm tra rằng bộ hẹn giờ chưa được tạo và thực hiện nhiệm vụ. Trong stopTimer() kiểm tra xem bộ đếm thời gian tồn tại trước khi gọi invalidate, và thiết lập bộ đếm thời gian trở lại nil.

Ngoài ra, đối với công cụ chọn của bạn, hãy đảm bảo bạn có tiền tố @obj. Bạn sẽ có thể nhận được một bộ đếm thời gian làm việc với mã được cung cấp. Chúc mừng mã hóa!

class SomeClass { 
    var timer: Timer? 

    func startTimer() { 
     guard timer == nil else { return } 
     timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(test), userInfo: nil, repeats: true) 
    } 

    func stopTimer() { 
     guard timer != nil else { return } 
     timer?.invalidate() 
     timer = nil 
    } 

    @objc func test() { 

    } 
} 
+0

Một điều cuối cùng, tôi không nghĩ ViewController.test là bắt buộc trong tham số chọn của bạn, kiểm tra sẽ hoạt động tốt. –

+0

tại sao kiểm tra xem vấn đề nil của nó trước khi bạn đặt nó thành nil –

+0

Nó ngăn chặn gọi invalidate() trên một đối tượng nil tiềm năng. Ví dụ, giả sử bạn gọi stopTimer() trong nhiều hàm. Nó kích hoạt một lần, vô hiệu hóa bộ đếm thời gian và được đặt trở về 0. Nếu stopTimer() được gọi một lần nữa trong kế, mà không reinitializing bộ đếm thời gian, bạn sẽ nhận được một lỗi nghiêm trọng. Điều này là do bộ hẹn giờ đã được deallocated. Cả hai báo cáo bảo vệ được đặt ra để tiếp tục bắt đầu và dừng hẹn giờ đồng bộ hóa. –

Các vấn đề liên quan