异步处理4
-(void)bigTaskAction{
[self.myActivityIndicator startAnimating];
//GCD支持名为代码队列的概念, 队列会呗调度以在下一个可用得处理器上执行,在使用GCD时,需要制定将代码放到哪个队列中,这里使用的是默认队列,默认队列也可用于后台处理,还可以使用朱队列,主队列类似于用具界面的主线程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
int updateUIWhen=1000;
for (int i=0;i<1000;i++) {
NSString*newString=[NSString stringWithFormat:@"i=%i",i ];
NSLog(@"%@ ",newString);
if (i==updateUIWhen) {
float f =(float)i/10000;
NSNumber*percentDone=[NSNumber numberWithFloat:f];
dispatch_sync(dispatch_get_main_queue(), ^{
[self.myProcessView setProgress:[percentDone floatValue ]animated:YES];
});
updateUIWhen=updateUIWhen+1000;
}
}
dispatch_sync(dispatch_get_main_queue(), ^{
[self.myProcessView setProgress:1.0 animated:YES];
[self.myActivityIndicator stopAnimating];
});
});
}
//类比:可以看出来,计算的操作放在后台另外一个进程中去计算,主线程主要用来大体的运行
之前加锁和开辟线程,现在用gcd一个就可以完成,并且使用函数dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 这是个会异步执行的GCD函数(跟开辟线程 和给线程枷锁 达到一个效果) 给线程枷锁这个步骤涵盖在函数:dispatch_sync(dispatch_get_main_queue(), ^{ 中, 刷新界面的操作代码放在主队列中进行
网友评论