NSOperationQueue内部的NSOperation未被执行

时间:2012-03-26 17:25:56

标签: ios nsoperation nsoperationqueue

我真的需要帮助。我在这一点上很绝望。

我有NSOperation,当添加到NSOperationQueue时没有被触发。 我添加了一些日志记录以查看NSOperation状态,结果如下:

Queue operations count = 1
Queue isSuspended = 0
Operation isCancelled? = 0
Operation isConcurrent? = 0
Operation isFinished? = 0
Operation isExecuted? = 0
Operation isReady? = 1
Operation dependencies? = 0

代码非常简单。没什么特别的。

       LoadingConflictEvents_iPad *loadingEvents = [[LoadingConflictEvents_iPad alloc] initWithNibName:@"LoadingConflictEvents_iPad" bundle:[NSBundle mainBundle]];

       loadingEvents.modalPresentationStyle = UIModalPresentationFormSheet;
       loadingEvents.conflictOpDelegate = self;

       [self presentModalViewController:loadingEvents animated:NO];

       [loadingEvents release];

       ConflictEventOperation *operation = [[ConflictEventOperation alloc] initWithParameters:wiLr.formNumber pWI_ID:wiLr.wi_id];

       [queue addOperation:operation];           

       NSLog(@"Queue operations count = %d",[queue operationCount]);
       NSLog(@"Queue isSuspended = %d",[queue isSuspended]);
       NSLog(@"Operation isCancelled? = %d",[operation isCancelled]);
       NSLog(@"Operation isConcurrent? = %d",[operation isConcurrent]);
       NSLog(@"Operation isFinished? = %d",[operation isFinished]);
       NSLog(@"Operation isExecuted? = %d",[operation isExecuting]);
       NSLog(@"Operation isReady? = %d",[operation isReady]);
       NSLog(@"Operation dependencies? = %d",[[operation dependencies] count]);


       [operation release];

现在我的操作在main方法上做了很多事情,但问题永远不会被调用。主要从未执行过。 最奇怪的事情(相信我,我并不疯狂......)如果我在任何NSLog行中或在创建操作中设置断点,将调用main方法并且一切都将完美地工作。

这项工作已经很长时间了。我最近做了一些改变,显然有些事情搞砸了。其中一项更改是将设备升级到iOS 5.1 SDK(iPad)。

要添加一些东西,我有这个应用程序的iPhone(iOS 5.1)版本使用相同的NSOperation对象。不同之处仅在于UI,一切正常。

哦,这只会在实际设备上失败。在模拟器中一切正常。

任何帮助都将非常感激。

此致

4 个答案:

答案 0 :(得分:5)

如果操作是并发的,则需要实现-start,而不是-main。

答案 1 :(得分:3)

好的,我终于解决了这个问题。

我遇到的问题是由于NSOperation一直在后台运行(但在不同的队列中)。此操作阻止执行任何其他线程(NSOperation)。这种情况仅发生在iPad 1中,因为它不是双核心。

我的NSOperation在主要方法上做了类似的事情:

- (void)main 
{
    while (![self isCancelled]) {
        //Do stuff
    }
}

并且NSOperation一直在做这件事

愚蠢的我,我没有给操作系统时间与其他线程一起工作,所以加入睡眠就成了伎俩

- (void)main
{
    while (![self isCancelled]) {
        [NSThread sleepForTimeInterval:0.5];
        //Do Stuff
    }
}

该睡眠使操作系统有机会与其他线程一起工作。

为什么要设置一个断点呢? ...调试器停止了所有线程,因为断点在我的另一个NSOperation中,该线程被执行了。

答案 2 :(得分:3)

我遇到了同样的问题,但我的解决方案并不相同,所以我想我也会在这里为我这样的未来人士提供答案。

我的问题是,在我的NSOperation子类中,我有:

@property CGPoint start;

,在合成时,创建方法:

-(CGPoint)start

覆盖NSOperation的 - (void)start;方法,它是非并发NSOperation的能指,并且阻止了 - (void)开始发生的所有常规事物,从而阻止了 - (void)main方法被调用。

一旦我将我的财产重新命名为启动之外的其他东西,它就可以正常工作。

答案 3 :(得分:0)

好的,这个问题只发生在使用SDK 5.1编译的应用程序的iPad 1设备上。 我尝试使用带有iOS 4.2.1的iPad 1和带有iOS 5.1的iPad 1。两者都给出了同样的问题。

可以肯定这适用于两台带有使用SDK 4.3编译的应用程序的iPad