CẬP NHẬT: Công cụ hiển thị rò rỉ khi làm việc này. Tiến hành thận trọng! Tôi đang giữ điều này ở đây trong trường hợp tôi thực sự đang làm gì đó và một người khác có thể tìm ra cách vượt qua rào cản rò rỉ.
Dưới đây là một ý tưởng xoắn, mà tôi lại cố gắng như tôi loại này:
Đặt hoạt động như đối tượng cho NSInvocationOperation 's initWithTarget: selector: đối tượng: phương pháp. Giả sử bạn đã có một NSOperationQueue (chúng tôi sẽ gọi nó là đợi):
NSInvocationOperation *operation = [NSInvocationOperation alloc];
operation = [operation initWithTarget:self selector:@selector(myOperation:) object:operation];
[queue addOperation:operation];
[operation release];
Lưu ý rằng chúng ta phải phá vỡ các alloc vào cuộc gọi riêng của mình. Nếu không, chúng tôi không thể đặt đối tượng thành hoạt động!
Sau đó, trong phương thức hoạt động của bạn, đưa đối tượng trở lại và rà soát séc cho isCancelled như mong muốn. Ví dụ:
- (void)myOperation:(id)object {
NSInvocationOperation *operation = (NSInvocationOperation *)object;
if ([operation isCancelled]) return;
...
}
Hãy chắc chắn chọn của bạn kết thúc với một dấu hai chấm trở lại trong initWithTarget: ... cuộc gọi, vì bạn sẽ được thông qua trong một đối tượng bây giờ.
Cho đến nay, rất tốt. Bây giờ nếu tôi có thể buộc cancelAllOperations, tôi sẽ biết nếu điều này thực sự hoạt động. :)
Nguồn
2009-08-11 21:03:42
Nhưng hãy xem các câu trả lời khác, có vẻ như bạn không thể làm điều này (ít nhất là theo cách tiêu chuẩn kiểm tra 'isCancelled') khi sử dụng' NSInvocationOperation'. – jrdioko