2010-11-20 24 views
5

Theo dõi sự kiện trong UIScrollview chặn chuỗi chính. Tôi đang sử dụng chuỗi chính để chạy bộ hẹn giờ thúc đẩy hoạt ảnh - kết quả là bất kỳ tương tác người dùng nào với chế độ xem có thể cuộn (kéo nó lên hoặc xuống, vv) làm cho hoạt ảnh (chạy trên bản chính) đóng băng. Có cách nào để giái quyết vấn đề này không?Theo dõi sự kiện trong UIScrollView chặn luồng chính. Mọi bản sửa lỗi?

Tôi đã cố gắng để RTFM về NSRunloop (CFRunLoopAddCommonMode et al), nhưng nó khá terse, dẫn tôi tin rằng tinkering với ưu tiên sự kiện/ưu tiên thread là tốt hơn tránh. Bất cứ ai có bất kỳ cái nhìn sâu sắc?

+1

Bạn chỉ có thể thực hiện giao diện người dùng trong chủ đề chính - do đó, việc làm rối các ưu tiên của chuỗi sẽ không áp dụng. Tôi tò mò - bạn có biết nếu NSTimers ngừng bắn, hoặc làm hẹn giờ lửa, nhưng từ chối áp dụng những thay đổi bạn thực hiện trong các hình ảnh động? Hoạt ảnh có được thực hiện * thành * UIScrollView hay * trong * scrollview không? tức là bạn đang cố gắng tạo hiệu ứng động và thay đổi cùng một thứ mà cuộn scrollview đang cố gắng thay đổi? (Rect xem cuộn, vv)? – Brad

+0

Cảm ơn, Brad - những gì tôi đã hy vọng (có thể nguy hiểm) để làm là thêm chế độ EventTracking vào runloop chính, do đó cho phép nó tiếp tục chạy đồng thời với vòng lặp EventTracking. Hoạt ảnh đang bị chặn thực sự đang được thực hiện trên một chế độ xem hoàn toàn khác với chế độ xem có chứa scrollview. Để trả lời câu hỏi khác của bạn, NSTimer ngừng bắn hoàn toàn. Dường như hoàn toàn bị chặn bởi doanh nghiệp ưu tiên cao hơn trong việc theo dõi các sự kiện của người dùng trên UIScrollView (không liên quan). –

Trả lời

16

Thay vì sử dụng một trong những nhà xây dựng tĩnh NSTimer của, tạo đối tượng hẹn giờ và sắp xếp nó bằng tay như thế này:

NSTimer *timer = [[NSTimer alloc] initWithFireDate:[NSDate dateWithTimeIntervalSinceNow:delayInSeconds] interval:0 target:yourObject selector:yourSelector userInfo:nil repeats:NO]; 
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 
[timer release]; 

paramters của bạn để initWithFireDate: sẽ khá khác nhau tất nhiên, đặc biệt là kể từ khi nó có vẻ như bạn' đang sử dụng bộ hẹn giờ lặp lại. Tôi nghĩ bạn có thể thấy ý tưởng cơ bản.

Khi bạn cuộn vòng lặp chạy vào chế độ ngăn các tác vụ "chế độ mặc định" thực hiện. Các NSTimer tĩnh chức năng tất cả các lịch trình vào chế độ mặc định đó là lý do tại sao họ không cháy trong khi bạn đang di chuyển. Lập lịch hẹn giờ theo cách thủ công cho phép bạn chỉ định chế độ và NSRunLoopCommonModes bao gồm chế độ chạy được sử dụng bằng cách cuộn.

+0

Brilliant! Tôi đã sử dụng: \t [[NSRunLoop mainRunLoop] addTimer: loopTimer forMode: [NSRunLoop currentMode]]; mà vẫn bị chặn. Sửa chữa của bạn hoạt động hoàn hảo. –

+0

Cảm ơn một nghìn tỷ! Sửa chữa này làm tăng khả năng sử dụng của bảng tải lười biếng của tôi đáng kể. – Nailer

0

Một ý tưởng là để bộ hẹn giờ chạy trên một chuỗi riêng biệt. Khi bộ đếm thời gian kích hoạt, sau đó có những gì nó cần phải chạy trên thread chính.

Edit:

Ah vâng, tôi hoàn toàn quên mất cách UIScrollView khối khá nhiều tất cả mọi thứ. Một ý tưởng khác (mặc dù rất xấu) là kiểm tra xem bộ hẹn giờ có được kích hoạt trong các phương thức ủy nhiệm (ví dụ: -scrollviewDidScroll, v.v.) của UIScrollView hay không. Nó thực sự là một loại hack, nhưng về cơ bản nó là cách duy nhất tôi biết để thực hiện bất kỳ mã nào trong khi cuộn.

+0

Cảm ơn, vâng tôi thực sự đã chạy bộ đếm thời gian hoạt ảnh của tôi trên chủ đề chính. Dường như việc theo dõi hậu trường của các sự kiện của người dùng chạy ở mức độ ưu tiên cao hơn chủ đề chính, vì vậy khi một thứ liên tục (như cuộn) xảy ra, nó sẽ chặn chuỗi chính trong một thời gian dài ... –

+0

@Andy Milburn: Xem chỉnh sửa cho ý tưởng khác. –

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