创建NSOperation并将其放入NSOperationQueue时,我从未看到调用main()。只有start()被调用。我真的没有做任何奇特的事。作为一个简单的测试,我写了这个:
NSOperationQueue *testOperationQueue = [[NSOperationQueue alloc] init];
MyTestOperation *testOperation = [[MyTestOperation alloc] init];
[testOperationQueue addOperation:testOperation];
在MyTestOperation.m中:
- (void)main
{
NSLog(@"testing if main is getting called");
}
- (void)start
{
NSLog(@"testing if start is getting called");
}
MyTestOperation.h如下所示:
#import <Foundation/Foundation.h>
@interface MyTestOperation : NSOperation
@end
我错过了一些明显的东西吗?
[编辑注意:我实际上是指非并发,而不是并发(如前一个标题所述)。]
答案 0 :(得分:7)
我玩了你的代码并注意到如果我完全注释掉你的start
方法,那么main
方法就会运行。在仔细阅读start
的文档之后,我找到了这一行:
此方法的默认实现更新操作的执行状态,并调用接收方的
main
方法。
因此,通过使用未调用start
的实现覆盖main
,您实际上会使操作短路,并且永远不会允许它实际开始工作!因此,您需要在main
方法中明确调用start
,或者如果您实际上没有使用它来执行设置/更新执行状态,则需要将start
全部消除在一起/等