1

我有一个串行队列,其中包含加载和图像两种方法,然后,一旦完成,将图像添加到子视图中。这些图像位于 NSMutableArray 中,因此我正在迭代 For 循环以将它们加载如下:

dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL); 
for (int i =0; i<=[pictureThumbnailArray count]-1; i++) {
    dispatch_async(queue, ^{

    NSLog(@"Thumbnail count is %d", [pictureThumbnailArray count]);

        finishedImage = [self setImage:[pictureThumbnailArray objectAtIndex:i]:i];

        if (finishedImage !=nil) {
        dispatch_async(dispatch_get_main_queue(), ^ {
        [self.view addSubview:finishedImage];
    });

        }
    });
                   }

问题是图像似乎是随机加载的。我想要实现的是 For 循环的每次迭代在下一次迭代开始之前运行并完成 - 这样图像每次都应该以相同的方式加载。

谁能建议实现这一目标的最佳方法 - 我想我可能需要同步 setImage 方法(队列中的第一个方法)?

变成 :

for (int i =0; i<=[pictureThumbnailArray count]-1; i++) {

    NSLog(@"Thumbnail count is %d", [pictureThumbnailArray count]);

        finishedImage = [self setImage:[pictureThumbnailArray objectAtIndex:i]:i];

        if (finishedImage !=nil) {
        dispatch_async(dispatch_get_main_queue(), ^ {
        [self.view addSubview:finishedImage];
    });

        }
                   }
    });
4

2 回答 2

0

您还有其他问题 - 也许您的图像数组不是您认为的顺序。queue 和 mainQueue 都是串行队列。为了验证这一点,我只是做了一个快速测试,并以预期的顺序获取了日志消息。我建议您尝试添加日志消息左右来找出为什么顺序不符合您的预期:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

static dispatch_queue_t queue;
    queue = dispatch_queue_create("com.example.MyQueue", NULL);

    for (int i =0; i<=20; i++) {
        dispatch_async(queue, ^{
            dispatch_async(dispatch_get_main_queue(), ^ {
                NSLog(@"Image %d", i);
            });
        } );
    }
}
于 2013-04-11T19:28:01.070 回答
0

如果我们在没有 GCD 的情况下做更简单的事情会怎样?我建议摆脱它并使用 NSURLConnectionDelegate 方法。

此方法下载下一张图片:

-(void)startDownload
{
    if (index < URLs.count)
    {
        NSURL *URL = [NSURL URLWithString:URLs[index]];
        _connection = [[NSURLConnection alloc] initWithRequest:[NSURLRequest requestWithURL:URL] delegate:self];
    }
}

委托方法将connectionDidFinishLoading:图像放置到视图中并开始下一次下载。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    UIImage *image = [UIImage imageWithData:_data];
    _data = nil;
    _connection = nil;
    UIImageView *imageView = (UIImageView *)[self.view viewWithTag:100+index];
    imageView.image = image;
    index++;
    [self startDownload];
}

这是完整的示例:https ://github.com/obrizan/TestImageDownload图像相当大,所以请给一些时间来加载它们。

于 2013-04-11T21:44:14.400 回答