Пометить пользовательский подкласс NSOperation как прекращенный? - PullRequest
1 голос
/ 02 сентября 2011

Я создал собственный подкласс NSOperation и переписал метод main.

@interface WGTask : NSOperation
@property(readonly) BOOL isExecuting,isFinished;
@end


@implementation WGTask
@synthesize isExecuting,isFinished;
- (void)start {
    ...
    [self willChangeValueForKey:@"isFinished"];
    isFinished=YES;
    [self didChangeValueForKey:@"isFinished"];
    ...
}
@end

Но этот код вызывает ошибку EXC_BAD_ACCESS. Удаление [self didChangeValueForKey:@"isFinished"] и [self willChangeValueForKey:@"isFinished"] решает проблему, но даже если значение isFinished правильно обновлено, NSOperationQueue не удаляет операцию!

Ответы [ 2 ]

2 голосов
/ 04 сентября 2011

Моя вина. Перед вызовом [self willChangeValueForKey:@"isFinished"] я вызывал метод делегата моего пользовательского подкласса, в котором я выпускал саму задачу. Вот почему я получил ошибку EXC_BAD_ACCESS, потому что self больше не существует.

1 голос
/ 02 сентября 2011

Не создавайте isExecuting et al. Как свойство

Из документов:

Если вы реализуете параллельную операцию, вы должны переопределить этот метод, чтобы вернуть состояние выполнения вашей операции,Если вы переопределяете его, обязательно генерируйте уведомления KVO для пути ключа isExecuting при каждом изменении состояния выполнения вашего объекта операции.Для получения дополнительной информации о создании вручную уведомлений KVO см. Руководство по программированию наблюдения значения ключа.

Действительно, вы, вероятно, хотите использовать семантику отмены NSOperation

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/NSOperation_class/Reference/Reference.html

Вы также можете прочитать

NSoperation и наблюдение значения ключа

и (если вы используете эти флаги для управления зависимостями)

NSOperation KVO problem

...