我有各种操作(源自NSOperation)来通过Internet进行异步查询。按照惯例,我将通过观察其isFinished属性来确定何时完成。

当一种特定类型的操作完成时,我想使用第一种方法中的信息来创建后续操作。但是,当我这样做时,在操作上调用addObserver会使我的应用程序崩溃,并且访问权限错误。由于观察者是在随机线程中调用的,因此我尝试创建后续操作并在主线程上设置观察者。没有不同。这是在observeValueForKeyPath中完成的:

GetMessagesOperation* msgOp =
  [[GetMessagesOperation alloc] initWithUserID:_user.getID()
                                     sinceLast:true
                                 includeSystem:true
                                   includeUser:false
                                      skipRows:0
                                      maxCount:50
                                     DBManager:_pDatabaseMgr];
[msgOp addObserver:self
        forKeyPath:@"isFinished"
           options:0
           context:getMessageContext];
[_operationQueue addOperation:msgOp];
[msgOp release];


上下文是字符串的void *;对于许多正常运行的其他操作,我使用相同的语法。以下是定义上下文的方式:

static void* systemInfoContext = (void*)@"sys";
static void* validateUserContext = (void*)@"user";
static void* getMessageContext = (void*)@"msg";


有人在这里猜吗?谢谢!

编辑:感谢您的答复。没有生成崩溃日志。它只是通过对addObserver行的错误访问而退出,并且无论我是在输入observeValueForKeyPath的主线程还是后台线程上执行,都会发生这种情况。

最佳答案

呸!整个问题是无法在操作的初始化方法中调用[super init]。

感谢所有仍在回答的人。

10-08 16:54