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

问题描述 投票:-4回答:1

以下代码需要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];
            });

        }); 
    }
}
ios grand-central-dispatch
1个回答
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绝对是您的界面。所以你肯定是在后台线程上与你的界面交谈。简而言之,您的代码不是线程安全的。

© www.soinside.com 2019 - 2024. All rights reserved.