2010-06-15 42 views
29

Hiện tại tôi đang sử dụng NSThread để lưu hình ảnh trong chuỗi khác.NSThread so với NSOperationQueue so với ??? trên iPhone

[NSThread detachNewThreadSelector:@selector(cacheImage:) toTarget:self withObject:image]; 

Cách khác:

[self performSelectorInBackground:@selector(cacheImage:) withObject:image]; 

Cách khác, tôi có thể sử dụng một NSOperationQueue

NSInvocationOperation *invOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(cacheImage:) object:image]; 
NSOperationQueue *opQueue = [[NSOperationQueue alloc] init]; 
[opQueue addOperation:invOperation]; 

Có lý do nào để chuyển đổi từ NSThread? GCD là một lựa chọn thứ 4 khi nó được phát hành cho iPhone, nhưng trừ khi có một hiệu suất đáng kể, tôi muốn gắn bó với các phương thức hoạt động trên hầu hết các nền tảng.


Dựa trên @ lời khuyên Jon-Eric, tôi đi với một giải pháp lớp con NSOperationQueue/NSOperation. Nó hoạt động rất tốt. Lớp NSOperation đủ linh hoạt để bạn có thể sử dụng nó với các lời gọi, khối hoặc lớp con tùy chỉnh, tùy thuộc vào nhu cầu của bạn. Không có vấn đề làm thế nào bạn tạo ra NSOperation của bạn, bạn chỉ có thể ném nó vào một hàng đợi hoạt động khi bạn đã sẵn sàng để chạy nó. Các hoạt động được thiết kế để hoạt động như một trong hai đối tượng mà bạn đưa vào hàng đợi hoặc bạn có thể chạy chúng như là các phương thức không đồng bộ độc lập, nếu bạn muốn. Vì bạn có thể dễ dàng chạy các phương thức hoạt động tùy chỉnh của mình một cách đồng bộ, việc kiểm tra dễ dàng một cách dễ dàng.

Tôi đã sử dụng kỹ thuật tương tự này trong một số dự án vì tôi đã hỏi câu hỏi này và tôi không thể hạnh phúc hơn với cách giữ mã của tôi và kiểm tra của tôi sạch sẽ, được tổ chức và vui vẻ không đồng bộ.

Một ++++++++++ có phân lớp một lần nữa

+0

Bạn có thể cấu hình từng người trong số họ. Đó sẽ là một cách để tìm hiểu. –

+0

Hiệu suất là từ sai, tôi nghi ngờ tất cả chúng đều giống nhau bên dưới. Tôi đang tìm kiếm một người có kinh nghiệm với hai hoặc nhiều hơn các phương pháp này để cho tôi một số lời khuyên về cách ưa thích và lý do tại sao nó tốt hơn. – kubi

Trả lời

32

Nói chung, bạn sẽ nhận được số dặm tốt hơn với NSOperationQueue.

Ba lý do cụ thể:

  • Bạn có thể muốn để bắt đầu bộ nhớ đệm của nhiều mặt hàng cùng một lúc. NSOperationQueue đủ thông minh để chỉ tạo ra bao nhiêu chủ đề có lõi, xếp hàng các hoạt động còn lại. Với NSThread, việc tạo 100 chủ đề cho bộ nhớ cache 100 hình ảnh có thể quá mức cần thiết và phần nào không hiệu quả.
  • Bạn có thể hủy hoạt động cacheImage. Việc hủy thực hiện dễ dàng hơn với NSOperationQueue; hầu hết công việc đã được thực hiện cho bạn.
  • NSOperationQueue là miễn phí để chuyển sang triển khai thông minh hơn (như Grand Central Dispatch) ngay bây giờ hoặc trong tương lai. NSThread có nhiều khả năng luôn là chuỗi hệ điều hành.

Bonus:

  • NSOperationQueue có một số cấu trúc tuyệt vời khác built-in, chẳng hạn như một cách tinh vi của tôn vinh những ưu tiên hoạt động và phụ thuộc.
+0

Giả sử bạn không cần các tính năng bổ sung mà NSOperationQueue cung cấp, Tại sao tạo 100 NSThread không hiệu quả? Hoặc là bạn giả sử nếu 100 chủ đề cần phải được tạo ra, phải có một nhu cầu cho một số goodies NSOperationQueue? – Tony

+4

@Tony: Tạo một chuỗi rất tốn kém. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html – kubi

5

Tôi sẽ sử dụng NSOperationQueue. Trong hệ điều hành 3.2, NSOperationQueue sử dụng các chủ đề dưới mui xe, do đó, hai phương pháp nên thực hiện tương tự. Tuy nhiên, dưới Mac OS 10.6, NSOperationQueue sử dụng GCD dưới mui xe và do đó có lợi thế là không có chi phí của các luồng riêng biệt. Tôi đã không xem xét các tài liệu cho OS 4, nhưng tôi nghi ngờ nó làm một cái gì đó tương tự - trong mọi trường hợp, NSOperationQueue có thể trao đổi triển khai nếu/khi lợi thế hiệu suất của GCD trở nên có sẵn cho iPhone.

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