【发布时间】:2013-07-29 08:17:06
【问题描述】:
我对 iOS 中 GCD 和队列的组合几乎没有疑问。让我把它们放在这里
首先。根据 IOS6 编程手册,这里是使用异步和同步下载图像的小代码 sn-p。及其如下
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 下载几张图片,同时我需要更新进度视图以显示已下载多少张图片。所以我使用以下代码sn-p
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 */ });
});
请注意,我正在更新主线程上的进度视图。但是在下载所有图像后,我的进度视图会显示出来。我检查了其他链接,但答案不是很清楚。没有得到问题的原因。我的代码如下。
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);
}
});
});
那么这里有什么问题?我的另一个疑问是,如果有人想在执行长时间处理任务时保持用户(显示进度视图或活动指示器),他们不能在主线程中这样做吗? (假设它们显示进度条或活动指示器),为什么我们必须使用异步、与并发线程或主线程同步等的组合。
我有点困惑,在什么情况下我必须使用异步、同步、主队列、并发队列、串行队列的正确组合。如果有人给我解释或为我提供了解异步、同步和 3 队列的组合的好链接。那会很棒。
【问题讨论】:
-
请格式化所有代码。在开始下载图片之前,您似乎要切换回主线程。
-
@Wain,我不明白你……你能简单解释一下吗?
标签: ios grand-central-dispatch