2012-01-20 34 views
0

我有以下代码的变体,由用户输入触发。完全神秘 - 随机延迟后执行iOS方法

NSLog(@"WHY YOU iOS!!!"); 
[scanButton setSelected:YES]; 
[overlayImageView setImage:image]; 
[overlayView setHidden:YES]; 

事情是,上述例程执行看似从5秒到一分多钟的随机延迟。

有时,他们根本不执行,除了神秘的NSLog方法。如果我在NSLog行设置断点,它只是立即执行,我可以看到“为什么你......”打印在控制台中。但是,即使调试器在下面三条线路上顺利运行而没有错误或警告,但接下来的三条线路的效果会在随机延迟或无限延迟之后发生。怎么了?他们怎么可能有随机延迟?

我怀疑Cocoa SDK的UI部分由于我的糟糕的程序设计或任何其他原因而暂停,但即使在随机延迟期间,其他按钮和功能也能正常工作,而setImage的效果突然在47.2秒内发生。 iOS或我有什么问题?

更让我困惑的是,如果图像参数(UIImage *)来自不同的来源,上述确切的例程无延迟地正常工作。如果是这样,我们可以将问题的原因归因于图像,但是,为什么scanButton和overlayView也会以相同的延迟响应,即使它们与图像无关?对我完全神秘。

+0

iOS没什么问题(好吧,iOS有很多错误,但可能不是这个部分)。请展示更多的代码 - 这些代码在哪里以及如何运行,以及之后会发生什么? –

+1

我在编码中学到的一件事是任何神秘都是可能的。这似乎是一个谜,因为你忽略了几个运动部件。如果你把所有的部分放在一起,你就解开了这个谜。它被称为调试! – mbh

+0

@mbh对。我刚解决了这个问题,发现这个谜题的根源是我的无知,而不是代码,或编译器的工作方式。他们不是神秘的,因为他们只是确定性的自动机。错误在我脑海中。现在,我应该开始调试我的头来调试实际的代码。无论如何,谢谢你的洞察力。 –

回答

3

我有什么事情不知道,因为在你所提供的代码几乎没有任何提示,但为什么你不尝试这样的事:

dispatch_async(dispatch_get_main_queue(), ^{ 

     NSLog(@"WHY YOU iOS!!!"); 
     [scanButton setSelected:YES]; 
     [overlayImageView setImage:image]; 
     [overlayView setHidden:YES]; 

     [overlayImageView setNeedsDisplay]; 
     [overlayImageView setNeedsLayout]; 

     [scanButton setNeedsDisplay]; 
     [scanButton setNeedsLayout]; 

     [overlayView setNeedsDisplay]; 
     [overlayView setNeedsLayout]; 

}); 

基本上保证总是以更新德主线程中的UI(如果您使用的是后台线程),并根据需要设置UI控件以进行重绘。

+1

如果您的UI特定函数没有及时响应,原因几乎可以确保您在后台线程上调用它们。我认为@ Ecarrion在这里得到了正确的答案。 –

+0

我会试一试并回报你。谢谢。 –

+0

非常感谢。你是我的英雄。随机延迟是由自定义队列引起的。当从队列中调用的方法调用上述例程时,它遵循自定义队列的序列,而不是主队列,并响应用户随机延迟的操作。我刚解决了这个问题,并将代码提交到了我们的git repo中,并将URL地址提供给了您的答案。再次感谢。 –