一次加载一个图像

时间:2013-04-05 15:27:38

标签: ios objective-c cocoa-touch afnetworking

因此,此代码基本上从服务器获取数据,创建图像,然后将其添加到视图中。

但是,我希望一次更新一个视图。

现在,在加载所有图像后,视图会立即更新。

我想在每次上传新图片时更新视图 - 这应该在addImage方法中发生,而是等待所有图像加载。

我尝试使用dispatch_async来解决这个问题,但它没有用。

那么如何一次加载一张图片?

    AFJSONRequestOperation *operation =
        [AFJSONRequestOperation JSONRequestOperationWithRequest:request
                                                        success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
       //some code not displayed here that parses the JSON
       for (NSDictionary *image in images){
           if ([[image objectForKey:@"ContentType"] isEqualToString:@"image/png"]){
               NSString *imgLink = [[image objectForKey:@"MediaUrl"] JSONStringWithOptions:JKSerializeOptionPretty includeQuotes:NO error:nil];
               NSURL *url = [NSURL URLWithString:path];
               NSData *data = [NSData dataWithContentsOfURL:url];
               UIImage *img = [[UIImage alloc] initWithData:data cache:NO]
               dispatch_async(dispatch_get_main_queue(), ^{
                   [self addImage:img];
                   //This method adds the image to the view
                });
           }
       }
   }

更新:这不是一个tableview,图像作为子视图添加到UIView

2 个答案:

答案 0 :(得分:0)

我相信你正在寻找一种延迟装载的形式。试试这个例子:Apple Lazy Loading example

答案 1 :(得分:0)

[NSData dataWithContentsOfURL:url];

是一个同步操作,所以你必须逐个等待每个图像,基于url的图片的正确延迟加载实现是最好的解决方案,同时你可以尝试做这样的事情

AFJSONRequestOperation *operation =
[AFJSONRequestOperation JSONRequestOperationWithRequest:request
                                                success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
                                                    //some code not displayed here that parses the JSON
                                                    for (NSDictionary *image in images){
                                                        if ([[image objectForKey:@"ContentType"] isEqualToString:@"image/png"]){
                                                            NSString *imgLink = [[image objectForKey:@"MediaUrl"] JSONStringWithOptions:JKSerializeOptionPretty includeQuotes:NO error:nil];
                                                            NSURL *url = [NSURL URLWithString:path];

                                        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
                                                                NSData *data = [NSData dataWithContentsOfURL:url];
                                                                UIImage *img = [[UIImage alloc] initWithData:data cache:NO]
                                                                dispatch_async(dispatch_get_main_queue(), ^{
                                                                    [self addImage:img];
                                                                    //This method adds the image to the view
                                                                });
                                                            })

                                                        }
                                                    }
                                                }

如果您想使用此解决方案,建议您创建自己的并发队列,而不是使用global_queue