1

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

- (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%,但它仍然可以重现

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

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

4

1 回答 1

0

这种情况在多线程应用程序中相当普遍。当代码可以在多个线程中执行时,您不能将它们在代码中的顺序作为它们的执行顺序。您似乎很有可能capturePhoto在后台线程上做一些工作。

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

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

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

我应该使用哪一个?虽然您可能会强制其中一个在任何情况下工作,但在某些时候,其中一个或另一个会始终比另一个更容易/更好/更实用。

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

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

于 2013-04-29T15:38:54.797 回答