在不同的线程上完成NSOperation

时间:2016-02-19 10:13:17

标签: ios multithreading nsoperation

我很好奇是否可以安全地在其原始线程的不同线程上完成自定义NSOperation,例如:

我有我的自定义操作类,它在不同的线程上执行,比如说线程B(不是主线程),然后在这个操作类中,我有明显的start()方法,在一开始我调用了[self markAsExecuting];方法表明操作已经开始工作,当然在我需要调用[self markAsFinished];之后,我必须调用所有工作并完成操作。 我的问题是:在我的操作本身执行的不同线程上调用[self markAsFinished];方法是否安全,请说线程C?

一些剪切代码:

      - (void)start {
        @autoreleasepool {
// *** Thread B
            [self markAsExecuting];

            [apiManager fetchData completion:^(NSDictionary *data, NSError *error) {
                if (error == nil) {
                      // As we know in this case when we do not indicate that AFNetworking response handle should be executed on different thread by default it will be executed on main thread, so that why I'm dispatching expensive work to the background 
                    self.queue = dispatch_queue_create("com.something.myapp.backgroundQueue", 0);
            dispatch_async(self.queue, ^{

                      // Some expensive work
// *** Thread C
                        [weakSelf markAsFinished];
                    });

                } else {
// *** Main Thread
                    [weakSelf markAsFinished];
                }
            }];
        }
    }

我希望我的问题解释足够清楚。

1 个答案:

答案 0 :(得分:0)

我的问题可能不够精确,markAsFinish方法仅将Operation状态设置为.finish,因此在这种情况下与调用哪个线程没有太大的不同