Trong ca cao chạm, UIApplication
tức là trường hợp ứng dụng của bạn được gắn vào sợi chính vì chuỗi này được tạo bởi UIApplicatioMain()
, chức năng điểm nhập của Cocoa Touch. Nó thiết lập vòng lặp sự kiện chính, bao gồm vòng lặp chạy của ứng dụng và bắt đầu xử lý các sự kiện. vòng lặp sự kiện chính của ứng dụng nhận được tất cả các sự kiện UI tức liên lạc, cử chỉ, vv
Từ docs UIApplicationMain()
,
Chức năng này instantiates đối tượng áp dụng từ lớp gốc và instantiates các đại biểu (nếu có) từ cho và đặt đại biểu cho ứng dụng. Nó cũng thiết lập vòng lặp sự kiện chính, bao gồm vòng lặp chạy của ứng dụng và bắt đầu xử lý các sự kiện. Nếu tệp Info.plist của ứng dụng chỉ định tệp nib chính cần tải, bằng cách bao gồm khóa NSMainNibFile và tên tệp nib hợp lệ cho giá trị, hàm này sẽ tải tệp nib đó.
Những sự kiện ứng dụng giao diện người dùng được tiếp tục chuyển tiếp đến UIResponder
's sau chuỗi phản ứng thường như UIApplication
->UIWindow
->UIViewController
->UIView
-> subviews (UIButton
, vv.)
Ứng xử lý sự kiện như nhấn nút, nhấn, thu phóng bằng pinch, vuốt v.v. được dịch là thay đổi trong giao diện người dùng. Do đó, bạn có thể thấy các chuỗi sự kiện này xảy ra trên luồng chính, đó là lý do tại sao UIKit
, khuôn khổ chứa các trình đáp ứng nên hoạt động trên chuỗi chính.
Từ tài liệu một lần nữa UIKit
,
Đối với hầu hết các phần, các lớp học UIKit nên chỉ được sử dụng từ chủ đề chính của ứng dụng. Điều này đặc biệt đúng đối với các lớp bắt nguồn từ UIResponder hoặc có liên quan đến việc thao tác với giao diện người dùng của ứng dụng của bạn theo bất kỳ cách nào.
EDIT
Tại sao drawRect cần phải được trên chủ đề chính?
drawRect:
được gọi là UIKit
là một phần của vòng đời UIView
. Vì vậy, drawRect:
bị ràng buộc với chủ đề chính. Vẽ theo cách này là tốn kém bởi vì nó được thực hiện bằng cách sử dụng CPU trên sợi chính. Đồ họa tăng tốc phần cứng được cung cấp bằng cách sử dụng kỹ thuật CALayer (Core Animation).
CALayer
mặt khác đóng vai trò như một cửa hàng sao lưu cho chế độ xem. Sau đó, khung nhìn sẽ chỉ hiển thị bitmap được lưu trong bộ nhớ cache của trạng thái hiện tại của nó. Mọi thay đổi đối với thuộc tính chế độ xem sẽ dẫn đến thay đổi trong cửa hàng sao lưu được GPU thực hiện trên bản sao được sao lưu. Tuy nhiên, chế độ xem vẫn cần cung cấp nội dung ban đầu và cập nhật chế độ xem định kỳ. Tôi đã không thực sự làm việc trên OpenGL nhưng tôi nghĩ rằng nó cũng sử dụng các lớp (tôi có thể sai).
Tôi đã cố gắng trả lời điều này theo sự hiểu biết tốt nhất của mình. Hy vọng rằng sẽ giúp!
Tôi đồng ý với hầu hết những gì bạn đã nói. Hãy để chúng tôi giả định rằng trả lời là về chủ đề chính và chúng tôi cần chủ đề chính để nhận các sự kiện nhưng những gì về rendering UIView? Tại sao chúng ta cần drawRect trên thread chính. Rất nhiều bản vẽ cũng có thể được thực hiện và tối ưu hóa bởi muti-threading tại sao khung UIKit không cho phép điều đó? Ngoài ra, tôi nghĩ rằng UIKIt là GPU tăng tốc sử dụng đa luồng. Tôi có thể sai về điều này. –
@KunalBalani Vui lòng kiểm tra chỉnh sửa của tôi – Amar
Xem http://stackoverflow.com/questions/21139300/having-uiview-drawrect-occur-in-a-background-thread –