2011-08-28 13 views
86

Kính gửi những người tốt của stackoverflow,NSDefaultRunLoopMode vs NSRunLoopCommonMode

Giống như lần cuối cùng, tôi đưa ra một câu hỏi mà tôi vừa mới vấp ngã. Tôi hy vọng có ai đó ở đó có thể làm sáng tỏ tôi.

Bất cứ khi nào tôi cố gắng tải xuống tệp lớn sau UIScrollView, MPMapView hoặc một cái gì đó, quá trình tải xuống sẽ bị tạm dừng ngay sau khi tôi chạm vào màn hình iPhone. Rất may, một bài đăng trên blog tuyệt vời theo số Jörn đề xuất một tùy chọn thay thế, sử dụng NSRunLoopCommonModes để kết nối.

Đó được tôi nhìn vào chi tiết của hai chế độ, NSDefaultRunLoopMode và NSRunLoopCommonModes, nhưng tài liệu táo không vui lòng giải thích, khác hơn là nói

NSDefaultRunLoopMode

Phương thức để đối phó với các nguồn đầu vào khác hơn đối tượng NSConnection. Đây là chế độ chạy vòng lặp thường được sử dụng nhất.

NSRunLoopCommonModes

Đối tượng được bổ sung vào một vòng lặp chạy sử dụng giá trị này là chế độ được theo dõi bởi tất cả các chế độ chạy vòng lặp đã được khai báo là một thành viên của tập hợp các phương thức “phổ biến", xem Mô tả của CFRunLoopAddCommonMode để biết chi tiết.

CFRunLoopAddCommonMode

Nguồn, hẹn giờ s, và các nhà quan sát được đăng ký một hoặc nhiều chế độ vòng lặp chạy và chỉ chạy khi vòng lặp chạy đang chạy ở một trong các chế độ đó. Các chế độ chung là một tập hợp các chế độ vòng lặp chạy mà bạn có thể xác định một tập hợp các nguồn, bộ hẹn giờ và các nhà quan sát được chia sẻ bởi các chế độ này. Thay vì đăng ký một nguồn, ví dụ, với từng chế độ vòng lặp chạy cụ thể, bạn có thể đăng ký nó một lần cho chế độ giả thông thường của vòng lặp chạy và nó sẽ tự động được đăng ký trong mỗi chế độ vòng lặp chạy trong tập chế độ chung. Tương tự như vậy, khi một chế độ được thêm vào tập hợp các chế độ chung, bất kỳ nguồn, bộ hẹn giờ hoặc người quan sát nào đã được đăng ký cho chế độ giả thông thường sẽ được thêm vào chế độ chung mới được thêm vào.

Có ai vui lòng giải thích hai bằng ngôn ngữ của con người không?

Trả lời

164

Vòng lặp chạy là một cơ chế cho phép hệ thống đánh thức các chủ đề ngủ để chúng có thể quản lý các sự kiện không đồng bộ. Thông thường khi bạn chạy một luồng (với ngoại lệ của chuỗi chính) có một tùy chọn để bắt đầu luồng trong một vòng lặp chạy hay không. Nếu luồng chạy một số hoạt động sắp xếp hoặc chạy dài mà không tương tác với các sự kiện bên ngoài và không có bộ hẹn giờ, bạn không cần chạy vòng lặp, nhưng nếu chuỗi của bạn cần phản hồi các sự kiện đến, nó sẽ được gắn vào vòng lặp chạy để đánh thức chủ đề khi có sự kiện mới. Đây là trường hợp của NSURLConnection chủ đề được tạo vì chúng chỉ đánh thức các sự kiện đến (từ mạng).

Mỗi chuỗi có thể được liên kết với nhiều vòng chạy hoặc có thể được liên kết với một vòng chạy cụ thể có thể được đặt để hoạt động ở các chế độ khác nhau. Một "chế độ vòng lặp chạy" là một quy ước được hệ điều hành sử dụng để thiết lập một số quy tắc cho thời điểm phân phối các sự kiện nhất định hoặc thu thập chúng để được phân phối sau này.

Thông thường tất cả các vòng chạy được đặt thành "chế độ mặc định", thiết lập một cách mặc định để quản lý các sự kiện đầu vào.Ví dụ: ngay khi sự kiện kéo chuột (Mac OS) hoặc chạm (trên iOS) xảy ra thì chế độ cho vòng lặp chạy này được đặt thành theo dõi sự kiện; điều này có nghĩa là luồng sẽ không được đánh thức trên các sự kiện mạng mới nhưng những sự kiện này sẽ được gửi sau khi sự kiện đầu vào của người dùng chấm dứt và vòng lặp chạy được đặt thành chế độ mặc định một lần nữa; rõ ràng đây là một lựa chọn được thực hiện bởi các kiến ​​trúc sư hệ điều hành để ưu tiên cho các sự kiện của người dùng thay vì các sự kiện nền.

Nếu bạn quyết định thay đổi chế độ vòng lặp chạy cho chủ đề NSURLConnection của bạn, bằng cách sử dụng scheduleInRunLoop:forModes:, sau đó bạn có thể gán các chủ đề để một vòng lặp chạy đặc biệt chế độ, chứ không phải là chạy mặc định vòng lặp cụ thể. Chế độ giả đặc biệt được gọi là NSRunLoopCommonModes được nhiều nguồn đầu vào sử dụng bao gồm theo dõi sự kiện. Ví dụ việc gán cá thể NSURLConnection cho chế độ chung có nghĩa là liên kết các sự kiện của nó với "chế độ theo dõi" ngoài "chế độ mặc định". Một lợi thế/bất lợi của việc kết hợp các luồng với NSRunLoopCommonModes là luồng sẽ không bị chặn bởi các sự kiện cảm ứng.

Chế độ mới có thể được thêm vào các chế độ chung, nhưng đây là một hoạt động khá thấp.

Tôi muốn đóng bằng cách thêm một vài lưu ý:

  • Thông thường chúng ta cần phải sử dụng một bộ hình ảnh hoặc thumbnails tải về từ mạng với một cái nhìn bảng. Chúng tôi có thể nghĩ rằng tải xuống những hình ảnh này từ mạng trong khi chế độ xem bảng là cuộn có thể cải thiện trải nghiệm người dùng (vì chúng tôi có thể xem hình ảnh trong khi cuộn), nhưng điều này không thuận lợi vì tính lưu động của có thể bị ảnh hưởng rất nhiều. Trong ví dụ này với NSURLConnection một vòng lặp chạy không nên được sử dụng; nó sẽ là tốt hơn để sử dụng các phương pháp đại biểu UIScrollView để phát hiện khi di chuyển được chấm dứt và sau đó cập nhật bảng và tải xuống các mục mới từ mạng;

  • Bạn có thể xem xét sử dụng GCD để giúp bạn “che chắn” mã của bạn từ các vấn đề quản lý vòng lặp chạy. Trong ví dụ trên, bạn có thể xem xét thêm yêu cầu mạng của mình vào hàng đợi nối tiếp tùy chỉnh.

+6

Kính gửi Viggio24, cảm ơn bạn rất nhiều vì lời giải thích chính xác, rõ ràng này. Tôi sẽ yêu cầu Apple đưa nhận xét của bạn vào hướng dẫn API của họ. ;) – Stkim1

+0

Tôi upvoted câu trả lời của bạn bởi vì là hoàn toàn rõ ràng !! Cảm ơn bạn đã chia sẻ kiến ​​thức của mình. Câu trả lời của –

+3

** viggio24 ** là hoàn hảo. Đối với những người quan tâm, tôi sẽ chỉ ra rằng ** Phiên 208 (Ứng dụng mạng cho hệ điều hành iPhone, Phần 2) ** từ WWDC 2010 chứa phần giới thiệu trên các vòng chạy. Nếu bạn quan tâm hãy xem. Hy vọng nó giúp. –

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