我不久前开始研究ObjectiveC,我试图编写一个具有两个UIImageView和一个URL数组的应用程序,以从Web加载。从URL异步加载所有图像之后,我想在UIImageViews上启动动画,该动画每3秒更改一次。我唯一的问题是,直到下载完所有图像后,我才需要动画。我到目前为止的代码是:
- (void)viewWillAppear:(BOOL)animated
{
self.imagesArray = [[NSMutableArray alloc] init];
[self initUrlArrayAndGetImages];
}
- (void)initUrlArrayAndGetImages
{
self.urlsArray = @[@"abc.com/1.png",
@"abc.com/2.png",
@"abc.com/3.png"];
for (int i = 0; i < [self.urlsArray count]; i++)
{
NSString *string = [self.urlsArray objectAtIndex:i];
NSURL *urlFromString = [NSURL URLWithString:string];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:urlFromString];
[NSURLConnection sendAsynchronousRequest:urlRequest queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError)
{
if (!connectionError)
{
UIImage *imageFromData = [UIImage imageWithData:data];
[self.imagesArray addObject:imageFromData];
}
else
{
NSLog(@"%@, %@", connectionError, [connectionError userInfo]);
}
}];
}
那么我将在哪里调用激 Activity 画的方法呢?因为如果我在块完成时调用它,则它一次添加一个图像(非常快,正确,但仍然始终刷新该方法...)。我最好的解决方案是什么?
提前致谢
最佳答案
您可以添加if()
语句,以检查imagesArray
中的图像计数是否等于urlsArray
中的URL计数。如果是这样,则调用动画。看起来像:
if (!connectionError)
{
UIImage *imageFromData = [UIImage imageWithData:data];
[self.imagesArray addObject:imageFromData];
if(self.imagesArray.count == self.urlsArray.count)
{
// All images are loaded successfully
// Activate animation
}
}
else
{
NSLog(@"%@, %@", connectionError, [connectionError userInfo]);
}
重要的是要注意,这只有在所有图像都成功下载后才能起作用。如果一个或多个导致连接错误,它将不调用动画。要解决此问题,您可以轻松实现一个专用计数变量,无论是否存在连接错误,该变量在调用
completionHandler
时都会递增。然后使用它与self.urlsArray.count
进行比较。
关于ios - 仅在从urls数组加载所有图像之后才激事件画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23873851/