2009-07-18 34 views
5

Có cách nào an toàn để thay đổi mức độ ưu tiên của NSOperation đã được đưa vào NSOperationQueue không? Nếu hoạt động chưa bắt đầu thì không có vấn đề gì, nhưng nếu nó đã được thực hiện thì tôi nhận được một NSInvalidArgumentException.Cách an toàn để thay đổi mức độ ưu tiên của NSOperation

+1

Bạn có thể cho chúng ta thấy dấu vết ngăn xếp và nội dung của các ngoại lệ? Có một chút khó khăn để chẩn đoán tại thời điểm này –

Trả lời

11

Bạn không được phép thay đổi NSOperation sau khi đã được đặt hàng. Theo Threading Programming Guide của Apple:

Chú ý: Bạn không bao giờ nên sửa đổi một đối tượng hoạt động sau khi nó đã được thêm vào một hàng đợi. Trong khi đợi trong hàng đợi , thao tác có thể thực hiện tại bất kỳ lúc nào. Thay đổi trạng thái của nó trong khi nó đang thực hiện có thể có tác động bất lợi . Bạn có thể sử dụng các phương thức của đối tượng hoạt động để xác định xem hoạt động có đang chạy hay không, đợi đến chạy hoặc đã hoàn tất.

+0

Liên kết được cập nhật: http://developer.apple.com/library/mac/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationObjects/OperationObjects.html#//apple_ref/doc/uid/TP40008091 -CH101-SW38 –

+0

@MichaelBaltaks - Cảm ơn, đã cập nhật. –

0

Trên docs không có cảnh báo về việc không thay đổi mức độ ưu tiên sau khi bắt đầu thao tác và không đề cập đến ngoại lệ đã nêu.

Trong thực tế, việc thay đổi mức ưu tiên của thao tác đang chạy chỉ đơn giản là không có hiệu lực. Có thể bạn đang làm sai điều gì đó ở nơi khác?

1

Theo Concurrency Programming Guide chúng ta sẽ có thể thay đổi các ưu tiên

For operations added to a queue, execution order is determined first by the 
readiness of the queued operations and then by their relative priority. 
Readiness is determined by an operation’s dependencies on other operations, 
but the priority level is an attribute of the operation object itself. 
By default, all new operation objects have a “normal” priority, but you 
can increase or decrease that priority as needed by calling the object’s 
setQueuePriority: method. 
Các vấn đề liên quan