方法不按顺序调用,在iPhone中调用第一种方法比使用第二种方法需要一些延迟

时间:2013-04-29 13:39:06

标签: iphone objective-c delay

我在按钮操作中调用了两个方法,

- (IBAction)capture:(id)sender
{

         /*1*/   [self.capturingWindow capturePhoto]; //capture pictures and pass the paths to imagePathsArray

            NSLog(@"imagePathsArray.count---%d",imagePathsArray.count) ;
         /*2*/    [self displayImagesOnScrollView:imagePathsArray];
}

我在图像捕捉按钮中有这两种方法。

1. [self.capturingWindow capturePhoto]; //capture pictures and pass the paths to imagePathsArray

此方法捕获图像并将捕获图像的路径填充到imagePathsArray

 2. [self displayImagesOnScrollView:imagePathsArray];

此方法使用这些填充的imagePathsArray,

在各个图像视图中显示图像..

问题是方法:1 [self.capturingWindow capturePhoto];需要一些时间来捕获并加载imagesPathsArray的路径。

同时方法:2 [self displayImagesOnScrollView:imagePathsArray];触发,因此由于数组超出边界而发生崩溃。

我试过

 [ self performSelector:@selector(displayImages) withObject:nil afterDelay:1]

而不是直接使用方法..

仍然没有用//它将问题减少40%,但仍会重现

我希望第二种方法只需要在第一种方法之后调用。

但最好保持较少的延迟(低优先级)

1 个答案:

答案 0 :(得分:0)

这种情况在多线程应用程序中相当常见。当代码可以在多个线程中执行时,您不能依赖它们在代码中的顺序来执行它们的顺序。你的capturePhoto很可能在后台主题上做了一些工作。

那么,我们如何解决这个问题呢?回调和通知主要是。

回调 - 这是您分配delegate的地方,每当发生重要步骤时,委托都会获得预定义的方法调用。一个很好的例子是NSURLConnectionNSURLConnectionDelegate

通知 - 这是一段代码在发生某些事件时广播消息的时间。希望了解事件的其他对象向通知中心注册以在发生时接收这些广播。这些对象必须在发送之前注册这些通知。对于这些,您可能会使用NSNotificationCenter并注册现有通知,例如applicationDidBecomeActive,甚至可以收听您创建的通知和“发布”。

我应该使用哪一个?虽然你可能强迫任何一个人在任何情况下都可以工作,但有时候一个或另一个会比另一个更容易/更好/更多功能

  • 如果您有多个对象想要在事情发生时得到通知,您可能需要通知。
  • 如果相同的消息可能来自不同的位置,您可能需要通知。
  • 如果一个对象和一个对象需要知道在不同对象上发生事件的时间,您通常需要回调。

回到手头的问题。要填充阵列,您需要创建一个回调或通知系统,以便capturePhoto可以告诉您阵列中何时有数据。此时,您可以开始使用该阵列。在此之前,您需要显示占位符数据或可能需要显示加载微调器。