0

我正在使用AFNetworking从我的应用程序中的服务器下载 json 和图像。我想使用 AFNetworking 以串行顺序下载图像,但响应顺序不正确,因为它以随机顺序提供图像。单击时,我在轮播中有缩略图,我想显示同一选定图像的更大图像,但是通过使用 AFNetworking,当我单击轮播图像时,我得到了随机图像。

我可以使用 GCD 中的串行队列来完成任务,但我想使用 AFNetworking 来完成任务。怎么做请建议。

以下是我使用 GCD 以串行顺序下载的代码

-(void)downloadImages:(NSMutableArray *)twitterThumbnailUrl withtwitterImages:(NSMutableArray *)twitterImageUrl
{
dispatch_queue_t queue;
    queue = dispatch_queue_create("myImageQueue", NULL);

    for(int i = 0; i<twitterThumbnailUrl.count; i++) {

        NSURL *imageUrl = [NSURL URLWithString:[twitterThumbnailUrl objectAtIndex:i]];
        NSURL *mainUrl = [NSURL URLWithString:[twitterImageUrl objectAtIndex:i]];

        dispatch_async(queue, ^{
            // do your stuff in the right order
            NSData *imageData = [NSData dataWithContentsOfURL:imageUrl];
            NSData *imgData = [NSData dataWithContentsOfURL:mainUrl];
            UIImage *image = [UIImage imageWithData:imageData];
            UIImage *mainImage = [UIImage imageWithData:imgData];
            if (image != NULL) {
                [self.twitterImages addObject:image];
                NSLog(@"num = %d", i);
            }

            if (mainImage != NULL) {
                [self.celebImageArray addObject:mainImage];
            }

            dispatch_async(dispatch_get_main_queue(), ^{
                [self.carousel reloadData];
                [spinner stopAnimating];
            });
        });
    }

}

下面是使用 AFNetworking 的代码

-(void)downloadTwitterImages:(NSString *)twitterImagesUrl
{
    // download the photo
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:twitterImagesUrl]];
    AFImageRequestOperation *operation = [AFImageRequestOperation
                                          imageRequestOperationWithRequest:request
                                          imageProcessingBlock:nil
                                          success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image)
                                          {

                                              if (image != nil) {

                                                  [self.celebImageArray addObject:image];
                                              }

                                              [self.carousel reloadData];

                                          } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
                                              NSLog(@"%@", error.description);

                                          }];

    [operation start];


}

我将如何在 AFNetworking 中进行相同的归档。请帮忙

更新:

我从这篇文章[链接]中尝试了这种方法,它正在按顺序下载图像

这是我的代码。如果我在这里做错了什么,请纠正我

- (void) downloadTwitterImages:(NSMutableArray *)thumbnailArray {

    { 
        [_thumbDownloadQueue cancelAllOperations];
        _thumbDownloadQueue = [[NSOperationQueue alloc] init];
        self.twitterImages = [[NSMutableArray alloc] init];
    }
    AFImageRequestOperation *previousOperation = nil;

    for (NSUInteger i = 0; i<[thumbnailArray count]; i++) {

        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[thumbnailArray objectAtIndex:i]]];
        AFImageRequestOperation *operation = [AFImageRequestOperation
                                              imageRequestOperationWithRequest:request
                                              imageProcessingBlock:nil
                                              success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image)
                                              {
                                                  if (image != nil) {
                                                      NSLog(@"thumbnail downloaded %@", image);

                                                      [self.twitterImages addObject:image];
                                                  }

                                              } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {
                                                  NSLog(@"%@", error.description);

                                              }];

        if (previousOperation) {
            [operation addDependency:previousOperation];
        }
        previousOperation = operation;

        [_thumbDownloadQueue addOperation:operation];

    }

}
4

1 回答 1

0

问题是您处理图像下载完成的代码不使用图像 URL 的索引。因此,生成的顺序取决于每个图像下载的速度。

考虑一些设置,例如在收到相关图像时设置celebImageArray充满实例NSNull并替换每个项目(使用循环中的索引,您将传递给下载方法)。或者,使用字典来存储图像,使用 URL 作为键,以便以后找到正确的图像。


当您获得图像 URL 列表时,请执行以下操作:

self.celebImageArray = [NSMutableArray array];

for (id url in self.twitterThumbnailUrl) {
    [self.celebImageArray addObject:[NSNull null]];
}

您现在有一个数组,其中的项目设置为默认值,但所有索引都是有效的。

代替

[self.celebImageArray addObject:image];

你将会拥有

[self.celebImageArray replaceObjectAtIndex:index withObject:image];

它将默认项目替换为真实项目。

当您尝试在单元格上使用图像时,您应该检查它是否是图像而不是NSNull

if ([[self.celebImageArray objectAtIndex:index] isKindOfClass:[UIImage class]]) {
    cell.imageView.image = [self.celebImageArray objectAtIndex:index];
}
于 2013-08-03T08:19:33.713 回答