Sự khác biệt giữa NSTimer
, NSTask
, NSThread
và NSRunloop
và có hướng dẫn về thời điểm sử dụng từng thiết bị không?Sự khác nhau cơ bản giữa NSTimer, NSTask, NSThread và NSRunloop là gì?
Trả lời
Mỗi chương trình chạy trong ít nhất một chủ đề. Bạn có thể nghĩ về từng luồng như một quá trình thực thi chương trình riêng biệt, mỗi luồng chạy song song với các luồng khác.
Nếu bạn có một số loại giao diện người dùng hoặc mã khác cần nghe sự kiện (như cổng mạng), bạn cần một vòng lặp chạy chạy. Mỗi NSThread tự động nhận được vòng lặp chạy của riêng nó, và bạn rất hiếm khi phải tự lo cho mình một cách trực tiếp. Vòng lặp chạy cũng chịu trách nhiệm tạo và giải phóng các nhóm tự động phát hành.
[EDIT: Xem nhận xét để thảo luận thêm về các nhóm tự động phát hành. Điểm quan trọng nhất cần lưu ý là các luồng mới phải đảm bảo thiết lập một nhóm tự động trả lời. Ví dụ, phương pháp được gọi với detachNewThreadSelector (xem dưới đây) cần phải có sau như dòng đầu tiên và cuối cùng của họ:.
NSAutoreleasePool *pool = [ [ NSAutoreleasePool alloc ] init ];
[code here]
[pool release];
cũng áp dụng cho đề sinh ra bằng các kỹ thuật khác]
Trong chính thread, nơi tất cả các xử lý giao diện người dùng đang diễn ra, vòng lặp chạy là rất quan trọng, vì nó giữ giao diện phản ứng. Đó là lý do tại sao bạn không bao giờ nên chạy mã tốn thời gian trên chủ đề chính: nó sẽ ăn hết thời gian trên luồng và vòng lặp chạy sẽ không được phép chạy thường xuyên, dẫn đến giao diện bị khóa hoặc chậm. Nếu bạn cần thực hiện các phép tính tốn thời gian hoặc giữ một tác vụ đang chạy trong nền, bạn nên tạo một chuỗi mới. Một lần nữa, bạn có thể không phải suy nghĩ về vòng lặp chạy mới được tạo ra. Một cách dễ dàng thực hiện một phương pháp trong một chủ đề mới:
[NSThread detachNewThreadSelector:@selector(theSelector) toTarget:self withObject:nil];
truyền thông liên sợi có thể được khôn lanh, và bạn cần phải nhận thức các phương pháp performSelector:onThread:withObject:waitUntilDone:
và performSelectorOnMainThread:withObject:waitUntilDone:
(Great lời khuyên về việc gửi NSNotifications qua đề here.)
Bộ hẹn giờ cũng được xử lý bởi các vòng chạy. Ngược lại với các vòng lặp chạy, bạn thường có thể sử dụng bộ hẹn giờ trực tiếp trong chương trình của mình. Cách dễ nhất để tạo bộ hẹn giờ là:
[self performSelector:@selector(aSelector) withObject:nil afterDelay:1.0];
nhưng đôi khi bạn muốn tự mình tạo và quản lý các đối tượng NSTimer, ví dụ để có thể hủy và sử dụng lại bộ hẹn giờ.
An NSTask được sử dụng để chạy chương trình khác dưới dạng tiến trình con của quy trình hiện tại. Đó là một chút tương tự như bắt đầu một thread riêng biệt, nhưng nếu một subprocess treo, chương trình chính của bạn sẽ tiếp tục chạy. Giao tiếp giữa các chương trình cũng rất khác với giao tiếp giữa một số luồng trong cùng một quá trình.
Bạn đã gắn thẻ câu hỏi của mình bằng "iphone" và trên iPhone, bạn sẽ không bao giờ sử dụng NSTask.
NSOperations được sử dụng khi bạn cần phải xử lý một lượng lớn các nhiệm vụ khác nhau, đặt chúng trong hàng đợi và/hoặc xử lý chúng trong chủ đề riêng biệt (mặc dù họ không có để chạy trong chủ đề riêng biệt). Nếu ứng dụng của bạn cần tạo một vài chủ đề chuyên biệt, thì không có lý do gì để sử dụng lớp NSOperation. Nhưng nếu bạn thường xuyên sẽ tạo ra các nhiệm vụ (như giao tiếp với một máy chủ) mà phải được theo dõi, NSOperation và NSOperationQueue sẽ có ích.
“Vòng lặp chạy cũng chịu trách nhiệm tạo và giải phóng các nhóm tự động phát hành.” Close. NSApplication thực hiện điều này (trên luồng chính), chứ không phải NSRunLoop. Nếu bạn sinh ra chủ đề của riêng bạn, bạn phải tạo hồ bơi của riêng bạn.(Tôi trích dẫn tài liệu NSAutoreleasePool: “Các đối tượng NSAutoreleasePool được tự động tạo và hủy trong chủ đề chính của ứng dụng dựa trên Bộ Ứng dụng…”.) –
Tôi nghĩ rằng bạn đều sai. Nếu bạn nhìn vào tệp main.m mainplate, * this * là nơi NSAutoreleasePool được tạo và quản lý. KHÔNG có mối tương quan giữa một runloop và một autoreleasepool gần như tôi có thể nói. – Lounges
Vòng lặp chạy có một bể tự động mà nó thoát qua từng chu kỳ. NSApplication không thể chịu trách nhiệm vì nó không có cách nào để thoát nó và nó không gọi mã của bạn. Thường có một hồ bơi autorelease trong chính, nhưng ngoài thời gian khởi tạo nó không bao giờ được sử dụng. –
NSTimer
là đối tượng hẹn giờ, một cách để gọi bộ chọn trên đối tượng trong tương lai.NSThread
là một lớp chuỗi. Tôi cho rằng bạn biết chủ đề là gì.NSTask
là một lớp quy trình, một cách để chạy một chương trình khác từ chương trình của bạn.NSOperation
(Tôi đang thêm vào câu hỏi) là một trừu tượng rất tốt đẹp cho một tác vụ duy nhất. Bạn nhúng hoạt động của mình vào lớp này và bạn có thể dễ dàng thực hiện đồng thời bằng phương tiện của lớp họcNSOperationQueue
.NSRunLoop
là điều khó hiểu nhất. Theo cách nào đó tóm tắt và điều chỉnh cuộc gọi hệ thống unixselect()
unix, quản lý các nguồn đầu vào và gửi đi các sự kiện và bộ hẹn giờ trên một chuỗi.
Nguyên tắc là Apple Threading Programming Guide.
Các câu trả lời khác thực hiện công việc khá tốt khi tính tổng thời gian, nhiệm vụ và chuỗi. Tôi muốn bình luận thêm một chút về NSRunloop vì tôi nghĩ rằng hầu hết các câu trả lời khác vẫn để lại một số rắc rối ở đây. Từ các tài liệu NSRunloop:
Một NSRunLoop đối tượng xử lý đầu vào cho các nguồn như chuột và bàn phím sự kiện từ hệ thống cửa sổ, NSPort đối tượng, và các đối tượng NSConnection. Một đối tượng NSRunLoop cũng xử lý các sự kiện của NSTimer .
cũng
Nói chung, ứng dụng của bạn không cần phải hoặc là tạo hoặc dứt khoát quản lý đối tượng NSRunLoop. Mỗi đối tượng NSThread NSThread, bao gồm chủ đề chính của ứng dụng , có đối tượng NSRunLoop được tự động tạo cho nó nếu cần. Nếu bạn cần truy cập vòng lặp chạy của chuỗi hiện tại, bạn làm như vậy với phương thức lớp currentRunLoop.
Hãy nghĩ NSRunloop là vòng xử lý sự kiện chính và gửi đi cho một chuỗi cụ thể. Nó đọc từ các thiết bị đầu vào, dịch vụ bất kỳ đối tượng nào cần được bảo trì và gửi dữ liệu một cách thích hợp.
Về cơ bản, tất cả xử lý đầu vào của người dùng diễn ra trong chuỗi chính, mặc dù các luồng khác có thể nghe các loại sự kiện khác. Tuy nhiên, trong nhiều chủ đề, runloop không đóng vai trò rõ ràng cho nhà phát triển, như khi bạn chỉ muốn chạy một phép tính tốn thời gian trong nền. – Felixyz
@DharmeshDhorajiya - Vui lòng ngừng đề xuất chỉnh sửa chỉ chèn định dạng mã cho những từ không cần đến. Ở trên là dấu ngoặc kép, không phải mã, và các lớp Cocoa không cần phải có định dạng mã xung quanh chúng. –
- 1. NSTimer và NSRunLoop
- 2. Sự khác nhau cơ bản giữa OSGi và Java EE là gì?
- 3. Sự khác nhau giữa ấn bản Orientdb là gì?
- 4. Sự khác nhau giữa NSImage và UIImage là gì?
- 5. Sự khác nhau giữa ssize_t và ptrdiff_t là gì?
- 6. Sự khác nhau giữa ImageMagick và GraphicsMagick là gì?
- 7. sự khác nhau giữa plugin và thư viện là gì?
- 8. Sự khác nhau giữa đá quý và plugin là gì?
- 9. Sự khác nhau giữa CreateWnd và CreateWindowHandle là gì?
- 10. Sự khác nhau giữa 'và #' trong Lisp là gì?
- 11. Sự khác biệt giữa [NSThread detachNewThreadSelector:] và -performSelectorInBackground
- 12. Sự khác nhau giữa Policy15 và Policy12 là gì?
- 13. Sự khác nhau giữa NHibernate và iBATIS.NET là gì?
- 14. Sự khác nhau giữa Request.Url.Query và Request.QueryString là gì?
- 15. Sự khác nhau giữa ODBC và OleDB là gì?
- 16. Sự khác nhau giữa NSLayoutAttributeBaseline và NSLayoutAttributeBottom là gì?
- 17. Sự khác nhau giữa LinFu.DynamicProxy và Castle.DynamicProxy là gì?
- 18. Sự khác nhau giữa Phing và PHPUnderControl là gì?
- 19. Sự khác nhau giữa AssemblyVersion, AssemblyFileVersion và AssemblyInformationalVersion là gì?
- 20. Sự khác nhau giữa null và System.DBNull.Value là gì?
- 21. Sự khác nhau giữa `Enum.name()` và `Enum.toString()` là gì?
- 22. Sự khác nhau giữa pls_integer và binary_integer là gì?
- 23. Sự khác nhau giữa javax.inject.Inject và com.google.inject.Inject là gì?
- 24. Sự khác nhau giữa root.destroy() và root.quit() là gì?
- 25. Sự khác nhau giữa $ @ và $ * trong UNIX là gì?
- 26. Sự khác nhau giữa các bản triển khai Bản đồ khác nhau trong Dart là gì?
- 27. Sự khác nhau giữa TFS, SVN và GIT là gì?
- 28. Sự khác nhau giữa "||" là gì và "hoặc" trong Perl?
- 29. sự khác nhau giữa DEFAULT_SIZE và PREFERRED_SIZE là gì?
- 30. Sự khác nhau giữa Lucene StandardAnalyzer và EnglishAnalyzer là gì?
Bạn cũng có thể quan tâm NSOperation. – titaniumdecoy