我创建了一个NSOperation
子类,其start方法包含对具有完成块的方法的调用。完成块包含将操作标记为已完成(KVO)的代码。该块似乎通常在主线程上执行(而不是我的NSOperationQueue'后台线程)。
我所看到的是,操作似乎没有被标记为已完成,我认为这是因为线程问题。有没有什么方法可以让KVO调用在正确的线程上发生,从而允许我的操作正确终止?
带有完成块的方法是第三方代码,所以我不想改变它。
编辑:这是相关代码。
-(void)start
{
[self willChangeValueForKey:@"isExecuting"];
_isExecuting = YES;
[self didChangeValueForKey:@"isExecuting"];
NSData *mutableData = [NSData thisIsWhereMyDataIsCreated];
[self.peripheral writeData:mutableData characteristicUUID:[CBUUID transmitCharacteristicUUID] serviceUUID:[CBUUID serviceUUID] completion:^(CBCharacteristic * _Nullable characteristic, NSError * _Nullable error) {
[self markAsFinished];
}];
}
-(void)markAsFinished
{
NSLog(@"Finishing op...");
[self willChangeValueForKey:@"isExecuting"];
[self willChangeValueForKey:@"isFinished"];
_isExecuting = NO;
_isFinished = YES;
[self didChangeValueForKey:@"isExecuting"];
[self didChangeValueForKey:@"isFinished"];
self.onComplete();
}
它是在主线程上调用的markAsFinished:
方法,通过completion block
用于writeData ...方法。