在不同的线程上完成 NSOperation
Finishing NSOperation on different thread
我很好奇在与原始线程不同的线程上完成自定义 NSOperation 是否安全,例如:
我有我的自定义操作 class,它在不同的线程上执行,比如说线程 B(不是主线程),然后在这个操作中 class 我显然有 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];
}
}];
}
}
我希望我的问题解释足够清楚。
我的问题可能不够准确,markAsFinish
方法仅将操作状态设置为 .finish,因此在这种情况下它与调用的线程没有太大区别
我很好奇在与原始线程不同的线程上完成自定义 NSOperation 是否安全,例如:
我有我的自定义操作 class,它在不同的线程上执行,比如说线程 B(不是主线程),然后在这个操作中 class 我显然有 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];
}
}];
}
}
我希望我的问题解释足够清楚。
我的问题可能不够准确,markAsFinish
方法仅将操作状态设置为 .finish,因此在这种情况下它与调用的线程没有太大区别