我正在开发一个使用plist文件的应用程序。 plist中有21个键值对。每对都是一个包含6个项目的字典(类型)。字典包含一组图像。在我的程序中,我使用路径来检索图像。我的要求是图像应该在imageView
上逐个显示。我成功完成了。这些图像与plist完全不同。
所以我的问题是我可以使用调试器来查看plist的中间执行吗?当我在我的代码中放置断点并使用调试器运行时,我能够进入代码并且只有在完成具有21个键值对的plist的整个执行之后才在视图上显示图像。在调试每对时,如何在视图上看到图像?
(void)setSequenceInfo:(NSDictionary *)sequenceInfo
{
[self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
self.sequenceQueue = [NSMutableArray array];
//load the sequenceinfo dictionary
[_sequenceInfo release];
if (!sequenceInfo)
return;
_sequenceInfo = [sequenceInfo retain];
//create one UIImageView by sequence
NSMutableDictionary* views = [NSMutableDictionary dictionaryWithCapacity:[sequenceInfo count]];
for (NSString* identifier in _sequenceInfo)
{
UIImageView* seqView = [[UIImageView alloc] initWithFrame:self.bounds];
seqView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
seqView.contentMode = self.contentMode;
//the image is hidden until its sequence is played
seqView.hidden=YES;
//add the newly created image view to our subviews
[self addSubview:seqView];
//also store it in our sequenceViews dictionary
[views setValue:seqView forKey:identifier];
[seqView release];
}
self.sequenceViews = views;
}
答案 0 :(得分:0)
为了在使用调试器时“看到”中间结果,您必须更改代码的结构以返回到主运行循环,以便UIImageView有机会运行并显示新映像。您可以设置定期触发的计时器,并在计时器例程中将UIImageView的图像更改为序列中的下一个图像。然后在gdb中的计时器处理程序方法中设置断点,并在每次看到之前显示的图像时点击该断点。
编辑:这里有一些更详细的信息,基于我认为你想做的事情。但要意识到,当你在调试器中时,我认为没有“魔杖”可以在屏幕上看到变化。您必须返回Run Loop,以便您的UIKIt小部件获得绘制自己的周期。例如,假设你有这种方法:
- (void) updateTwoLabels:(NSString *)newText
{
self.label1.text = newText;
self.label2.text = newText; // put breakpoint on this line
}
并且您希望在设置label2的文本之前停止在调试器中,并且看到label1已更改。好吧,我认为没有办法做到这一点,除非修改你的代码,并用performSelector再次调用自己:withObject:afterDelay:这样主运行循环可以运行一段时间再调用你的代码:
BOOL callAgain = NO;
BOOL setLabel2 = YES;
- (void) updateTwoLabels:(NSString *)newText
{
self.label1.text = newText;
if ( setLabel2 )
self.label2.text = newText; // put breakpoint on this line
if ( callAgain )
[self performSelector:@selector(updateTwoLabels:) withObject:newText afterDelay:0];
}
这样,当你进行调试时,你可以在gdbg中将callAgain设置为YES并将setLabel2设置为NO,并保持“继续”直到你看到label1已经改变。这是基本技术。
答案 1 :(得分:0)
在后台线程中执行整个方法,但在主线程上调用GUI内容。例如:[self performSelectorOnMainThread:@selector(addSubview :) withObject:seqView waitUntilDone:YES]。不要忘记在方法的开头(在后台线程中运行的那个)创建一个自动释放池,并将其排除在它的末尾。