在这个异步操作中会导致45秒延迟的原因是什么?

时间:2015-01-27 02:47:29

标签: ios grand-central-dispatch

以下代码需要45秒才能完成。我要做的就是在启动时显示单个图像,而不是在用户返回第一个UI视图时重新加载。

- (void)viewDidLoad {
    [super viewDidLoad];    
     dispatch_queue_t myQueue = dispatch_queue_create("My Queue",NULL);
    dispatch_async(myQueue, ^{
        // Perform long running process

        dispatch_async(dispatch_get_main_queue(), ^{
            // Update the UI
        });
    });

}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    NSArray *image = @[@"https://dl.dropboxusercontent.com/u/60438364/main.jpg"];

    dispatch_queue_t imageQueue = dispatch_queue_create("Image Queue",NULL);

    for (NSString *urlString in image) {
        dispatch_async(imageQueue, ^{

            NSURL * imageURL = [NSURL URLWithString:@"https://dl.dropboxusercontent.com/u/60438364/main.jpg"];
            NSData * imageData = [NSData dataWithContentsOfURL:imageURL];
            self.image.image = [UIImage imageWithData:imageData];

            NSUInteger imageIndex = [image indexOfObject:urlString];
            UIImageView *image = (UIImageView *)[self.view viewWithTag:imageIndex];

            if (image) return;

            dispatch_async(dispatch_get_main_queue(), ^{
                // Update the UI
                [image setImage:self.image.image];
            });

        }); 
    }
}

1 个答案:

答案 0 :(得分:2)

这可能是问题所在:

    dispatch_async(imageQueue, ^{
        NSURL * imageURL = [NSURL URLWithString:@"https://dl.dropboxusercontent.com/u/60438364/main.jpg"];
        NSData * imageData = [NSData dataWithContentsOfURL:imageURL];
        self.image.image = [UIImage imageWithData:imageData];

如果您的界面中有self.image,那就是问题 - 您正在尝试在后台线程上更新界面。这是非法的。即使它不在界面中,您也在后台线程上更新self,这可能同样有问题。

如果这不是问题,那肯定是:

    dispatch_async(imageQueue, ^{
        // ...
        UIImageView *image = (UIImageView *)[self.view viewWithTag:imageIndex];

self.view 肯定是您的界面。所以你肯定是在后台线程上与你的界面交谈。 简而言之,您的代码不是线程安全的。