我真的需要帮助。我在这一点上很绝望。
我有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,一切正常。
哦,这只会在实际设备上失败。在模拟器中一切正常。
任何帮助都将非常感激。
此致
答案 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