2011-08-14 37 views
6

Tôi có một số UIScrollView có một loạt các nhãn đang cập nhật nhanh số (mỗi 0,06 giây). Tuy nhiên, trong khi chế độ xem cuộn đang di chuyển, thì NSTimer bị tạm dừng và không tiếp tục cho đến sau khi cuộn và hoạt ảnh đàn hồi đã kết thúc.UIScrollView tạm dừng NSTimer trong khi cuộn

Làm cách nào để tránh điều này và chạy NSTimer bất kể trạng thái của chế độ xem cuộn?

Trả lời

22

Cách dễ dàng để khắc phục điều này là thêm NSTimer của bạn vào mainRunLoop.

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

Để loại bỏ một bộ đếm thời gian từ tất cả các chế độ vòng lặp chạy trên đó nó được cài đặt, gửi tin nhắn invalidate để hẹn giờ.

+0

Vì vậy, với điều này tôi không thực sự có để kích hoạt bộ hẹn giờ, nó được khởi tạo khi dòng đó được thực thi, đúng không? –

+0

Từ tài liệu: "Bạn có thể thêm bộ hẹn giờ vào nhiều chế độ nhập. Trong khi đang chạy ở chế độ được chỉ định, bộ thu làm hẹn giờ kích hoạt hoặc sau ngày khởi động được lập lịch của nó. là một bộ chọn trên một đối tượng được chỉ định. " –

0

(Swift) Một thay thế: Bạn có thể sử dụng một hệ thống hẹn giờ GCD-based như thế này một:

class GCDTimer { 

    private var _timer : dispatch_source_t? 

    init() { 

    } 

    private func _createTheTimer(interval : Double, queue : dispatch_queue_t, block : (() -> Void)) -> dispatch_source_t 
    { 
     let timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); 
     if (timer != nil) 
     { 
      dispatch_source_set_timer(timer, dispatch_time(DISPATCH_TIME_NOW, Int64(interval * Double(NSEC_PER_SEC))), UInt64(interval * Double(NSEC_PER_SEC)), (1 * NSEC_PER_SEC)/10); 
      dispatch_source_set_event_handler(timer, block); 
      dispatch_resume(timer); 
     } 
     return timer; 
    } 


    func start(interval : Double, block : (() -> Void)) 
    { 
     let queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 

     _timer = _createTheTimer(interval, queue: queue, block: block) 

    } 

    func stop() 
    { 
     if (_timer != nil) { 
      dispatch_source_cancel(_timer!); 
      _timer = nil; 
     } 
    } 
} 
+0

Đây là cách bạn sẽ sử dụng nó: 'var myInterval: GCDTimer = GCDTimer() myInterval.start (1.0) { println ("lol") } ' – Thyselius

+0

Nếu bạn muốn chắc một cập nhật cho một yếu tố giao diện người dùng sử dụng hẹn giờ này, bạn phải làm điều này trên các chủ đề chính, như thế này: 'dispatch_async (dispatch_get_main_queue(), { \t \t \t \t \t \t self.myUIImageView.image = UIImage (dữ liệu:! dữ liệu như NSData) \t \t \t \t \t}) ' – Thyselius

+0

rất vui vì bạn thấy nó hữu ích! – raf

1

cho nhanh:

NSRunLoop.mainRunLoop().addTimer(timer, forMode: NSRunLoopCommonModes) 
Các vấn đề liên quan