2011-07-13 29 views
6

thể trùng lặp:
UIScrollView pauses NSTimer until scrolling finishesTại sao hẹn giờ dừng khi cuộn trong UIWebView iPhone?

Tôi gặp một chút khó khăn để tìm ra lý do tại sao NSTimer dừng ngay sau khi tôi di chuyển trong UIWebView. Xin hãy nhìn vào đoạn mã sau (Tôi biết đây không phải là một trang web làm bài tập, nhưng tôi thành thật là khó khăn):

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSString *address = @"http://en.m.wikipedia.org/wiki/"; 
    NSURL *url = [NSURL URLWithString:address]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
    [wiki loadRequest:request]; 
    time = 0; 
    countValue = 0; 
    timer = [NSTimer scheduledTimerWithTimeInterval: 0.1 target: self selector: @selector(updateTimer) userInfo: nil repeats: YES]; 
    timeRand = 0; 
    countValueRand = 1; 
    randomTimer = [NSTimer scheduledTimerWithTimeInterval: 0.1 target: self selector: @selector(updateRandomTimer) userInfo: nil repeats: YES]; 
    [self generateWordsArray]; 
} 
+1

gì thực sự có vấn đề ở đây, làm thế nào tìm kiếm của bạn '- (void) updateTimer' và' - (void) updateRandomTimer'? Có thể có cái gì đó dừng hẹn giờ của bạn? Bạn có chắc chắn cuộn đang dừng hẹn giờ không? –

+1

dừng hoặc bị trì hoãn? –

+0

Xin chào, cảm ơn rất nhiều vì sự giúp đỡ của bạn, tuy nhiên tôi chắc chắn rằng webview không ngừng hẹn giờ hoạt động ... – dyang

Trả lời

28

Bạn phải thêm bộ hẹn giờ vào một RunLoopMode khác. Theo mặc định, bộ hẹn giờ được thêm vào NSDefaultRunLoopMode. Điều đó có nghĩa là bộ hẹn giờ chỉ thực thi khi vòng lặp chạy của ứng dụng nằm trong NSDefaultRunLoopMode.

Bây giờ, khi người dùng chạm vào màn hình (ví dụ: để cuộn UIScrollView), chế độ vòng lặp chạy sẽ được chuyển sang NSEventTrackingRunLoopMode. Và bây giờ, vòng lặp chạy không còn trong NSDefaultRunMode nữa, bộ hẹn giờ sẽ không thực thi. Hiệu ứng xấu xí của điều đó là, bộ hẹn giờ đó bị chặn bất cứ khi nào người dùng chạm vào màn hình. Và đó có thể là một thời gian dài khi người dùng đang cuộn, vì bộ hẹn giờ bị chặn cho đến khi cuộn hoàn toàn dừng lại. Và khi người dùng tiếp tục cuộn, bộ hẹn giờ sẽ bị chặn lại.

May mắn thay giải pháp cho vấn đề này khá đơn giản: Bạn có thể thêm bộ hẹn giờ của mình vào NSRunLoopMode khác. Khi thêm bộ đếm thời gian vào NSRunLoopCommonModes, nó sẽ thực hiện trong tất cả các chế độ vòng lặp chạy (đã được khai báo là một thành viên của tập hợp các chế độ "phổ biến", chính xác). Điều đó có nghĩa là bộ đếm thời gian không chỉ hoạt động trong NSDefaultRunLoopMode mà còn trong NSEventTrackingRunLoopMode (khi người dùng chạm vào màn hình).

Vì vậy, sau khi bạn khởi tạo timer của bạn, thêm nó vào NSRunLoopCommonModes:

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

bạn, bạn của tôi, rất vui! – dyang

+0

Bạn tôi cũng vậy !! –

1

Vâng khối tương tác người dùng thread chính vì vậy các bộ đếm thời gian bị trì hoãn vì nó thêm nó vào vòng lặp chạy của luồng hiện tại.

Nếu bạn muốn hẹn giờ được gọi không phân biệt tương tác của người dùng, bạn nên xem xét sinh ra một chuỗi mới và gắn bộ hẹn giờ vào chuỗi đó.

Bạn cũng có thể xem GCD based timer bằng Mike Ash sẽ chạy ở chế độ nền. Điều duy nhất bạn nên nhớ là cập nhật giao diện người dùng phải được thực hiện trên luồng chính.

+0

cảm ơn rất nhiều sự giúp đỡ của bạn! – dyang

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