从另一个线程

时间:2016-05-31 10:10:14

标签: ios objective-c objective-c-blocks nsoperation nsoperationqueue

我创建了一个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 ...方法。

0 个答案:

没有答案