我在按钮操作中调用了两个方法,
- (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%,但仍会重现
我希望第二种方法只需要在第一种方法之后调用。
但最好保持较少的延迟(低优先级)
答案 0 :(得分:0)
这种情况在多线程应用程序中相当常见。当代码可以在多个线程中执行时,您不能依赖它们在代码中的顺序来执行它们的顺序。你的capturePhoto
很可能在后台主题上做了一些工作。
那么,我们如何解决这个问题呢?回调和通知主要是。
回调 - 这是您分配delegate
的地方,每当发生重要步骤时,委托都会获得预定义的方法调用。一个很好的例子是NSURLConnection
和NSURLConnectionDelegate
。
通知 - 这是一段代码在发生某些事件时广播消息的时间。希望了解事件的其他对象向通知中心注册以在发生时接收这些广播。这些对象必须在发送之前注册这些通知。对于这些,您可能会使用NSNotificationCenter
并注册现有通知,例如applicationDidBecomeActive
,甚至可以收听您创建的通知和“发布”。
我应该使用哪一个?虽然你可能强迫任何一个人在任何情况下都可以工作,但有时候一个或另一个会比另一个更容易/更好/更多功能
回到手头的问题。要填充阵列,您需要创建一个回调或通知系统,以便capturePhoto
可以告诉您阵列中何时有数据。此时,您可以开始使用该阵列。在此之前,您需要显示占位符数据或可能需要显示加载微调器。