gpt4 book ai didi

ios - 如何在异步线程中更新 ProgressView

转载 作者:行者123 更新时间:2023-11-28 22:29:23 24 4
gpt4 key购买 nike

我对 iOS 中 GCD 和队列的组合几乎没有怀疑。让我把它们放在这里

首先。根据 IOS6 programming cookbook,这里是使用异步和同步下载图像的小代码片段。如下所示

dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);dispatch_async (concurrentQueue, ^ {
UIImage *image = nil;
dispatch_sync(concurrentQueue, ^ { /* download image here */ });
dispatch_sync(dispatch_get_main_queue, ^ { /* show the downloaded image here */ });
});

其次。我需要从 Url 下载一些图片,同时我需要更新进度 View 以显示已下载了多少图片。所以我正在使用以下代码片段

dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async (concurrentQueue, ^ { dispatch_sync(dispatch_get_main_queue, ^ { /* download image here and update progress view here */ });
});

请注意,我正在更新主线程上的进度 View 。但是我的进度 View 是在所有图像下载完成后显示的。我检查了其他链接,但对答案不是很清楚。没有得到问题的原因。我的代码如下。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{dispatch_sync(dispatch_get_main_queue(), ^{
alert = [[UIAlertView alloc] initWithTitle:@"Please Wait Downloading reports..." message:nil delegate:self cancelButtonTitle:nil otherButtonTitles: nil] ;
prgView = [[UIProgressView alloc]initWithProgressViewStyle:UIProgressViewStyleBar];
prgView.frame = CGRectMake(10, 50, 270, 20);
[alert addSubview:prgView];
[alert show];
prgView.progress=0.0;
actual= 0.0;

for(NSInteger i=0; i<[fileLinks count];i++)
{

// [self downLoadFileFromUrl : fileLinks[i]: i ];
NSLog(@"Url is %@", fileLinks[i]);
NSLog(@"i value is %d", i);
NSData *imagedata = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileLinks[i]]];
NSString * _filename= [fileLinks[i] lastPathComponent];
NSMutableString *filePath = [[NSMutableString alloc] initWithFormat:@"%@", [VSCore getTempFolder]];
[filePath appendString: _filename] ;
[imagedata writeToFile: filePath atomically:YES];
prgView.progress =((float) i /([fileLinks count]));
NSLog(@" progress value is %f", prgView.progress);

}
});
});

那么这里有什么问题呢?我的另一个疑问是,如果有人想在执行长时间处理任务时保留用户(显示进度 View 或事件指示器),他们不能在主线程中这样做吗? (如果它们显示进度条或事件指示器),为什么我们必须使用异步、与并发线程或主线程同步等的组合。

我有点困惑,在什么情况下我必须使用异步、同步、主队列、并发队列、串行队列的适当组合。如果有人给我解释或为我提供很好的链接以了解 async 、 sync 和 3 queue 的组合。那会很棒。

最佳答案

您应该在主队列上创建和更新“UIProgressView”

然后在另一个队列(不是主队列)上做你的工作

在你工作的时候,如果你想更新 GUI 上的任何对象,你应该在主队列上进行

你可以这样做:

alert = [[UIAlertView alloc] initWithTitle:@"Please Wait Downloading reports..." message:nil delegate:self cancelButtonTitle:nil otherButtonTitles: nil] ;
prgView = [[UIProgressView alloc]initWithProgressViewStyle:UIProgressViewStyleBar];
prgView.frame = CGRectMake(10, 50, 270, 20);
[alert addSubview:prgView];
[alert show];
prgView.progress=0.0;
actual= 0.0;

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
for(NSInteger i=0; i<[fileLinks count];i++)
{
// [self downLoadFileFromUrl : fileLinks[i]: i ];
NSLog(@"Url is %@", fileLinks[i]);
NSLog(@"i value is %d", i);
NSData *imagedata = [NSData dataWithContentsOfURL:[NSURL URLWithString:fileLinks[i]]];
NSString * _filename= [fileLinks[i] lastPathComponent];
NSMutableString *filePath = [[NSMutableString alloc] initWithFormat:@"%@", [VSCore getTempFolder]];
[filePath appendString: _filename] ;
[imagedata writeToFile: filePath atomically:YES];

dispatch_async(dispatch_get_main_queue(), ^{
prgView.progress =((float) i /([fileLinks count]));
});
NSLog(@" progress value is %f", prgView.progress);
}
});

你可以阅读电子书:“Pro.Multithreading.and.Memory.Management.for.iOS.and.OS.X”(购买或询问 gg)

祝你好运!

关于ios - 如何在异步线程中更新 ProgressView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17919085/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com