GCD使用(二)执行与UI无关的操作
来源:互联网 发布:家装网络布线方案 编辑:程序博客网 时间:2024/05/23 15:42
1。并发队列:dispatch_get_global_queue
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
参数:优先等级DISPATCH_QUEUE_PRIORITY_LOW , DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_PRIORITY_HIGH
2。 void dispatch_sync( dispatch_queue_t queue, dispatch_block_t block);
在其所属的队列(queue)中是同步操作,即该队列中后续操作必须要等此代码完成方可进行,但其它队列可并发进行
虽然是同步操作,但若分属于多个不同队列时,也可以有异步效果
根据GCD的优化原则,队列(queue)也有可能是在主线程中运行
e.g. 1 图像下载
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(concurrentQueue, ^{
__block UIImage *image = nil;
/* Download the image here 此操作不会阻塞主线程 ,因为它是在concurrentQueue队列中操作 */
dispatch_sync(concurrentQueue, ^{
//折行用 \
NSString *urlAsString =
@"http://images.apple.com/mobileme/features"\
"/images/ipad_findyouripad_20100518.jpg";
NSURL *url = [NSURL URLWithString:urlAsString];
NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
NSError *downloadError = nil;
NSData *imageData = [NSURLConnection sendSynchronousRequest:urlRequest
returningResponse:nil error:&downloadError];
if (downloadError == nil && imageData != nil){
image = [UIImage imageWithData:imageData];
/* We have the image. We can use it now */
}
else if (downloadError != nil){
NSLog(@"Error happened = %@", downloadError);
} else {
NSLog(@"No data could get downloaded from the URL.");
}
});
//同步操作 ,但分属于不同队列(主线程中)
dispatch_sync(dispatch_get_main_queue(), ^{
/* Show the image to the user here on the main queue*/
if (image != nil){
UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
[imageView setImage:image];
[imageView setContentMode:UIViewContentModeScaleAspectFit];
[self.view addSubview:imageView];
} else {
NSLog(@"Image isn't downloaded. Nothing to display.");
}
});
});
e.g. 2 文件示例
- (NSString *) fileLocation{
NSArray *folders = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
if ([folders count] == 0){
return nil;
}
NSString *documentsFolder = folders[0];
return [documentsFolder stringByAppendingPathComponent:@"list.txt"];
}
- (BOOL) hasFileAlreadyBeenCreated{
BOOL result = NO;
NSFileManager *fileManager = [[NSFileManager alloc] init];
if ([fileManager fileExistsAtPath:[self fileLocation]]){
result = YES;
}
return result;
}
- (void) viewDidAppear:(BOOL)paramAnimated{
[super viewDidAppear:paramAnimated];
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(concurrentQueue, ^{
NSUInteger numberOfValuesRequired = 10000;
if ([self hasFileAlreadyBeenCreated] == NO){
//同步,创建文件 (因不在主线程中操作,不会阻塞主线程)
dispatch_sync(concurrentQueue, ^{
NSMutableArray *arrayOfRandomNumbers = [[NSMutableArray alloc] initWithCapacity:numberOfValuesRequired];
NSUInteger counter = 0;
for (counter = 0; counter < numberOfValuesRequired; counter++){
unsigned int randomNumber = arc4random() % ((unsigned int)RAND_MAX + 1);
[arrayOfRandomNumbers addObject: [NSNumber numberWithUnsignedInt:randomNumber]];
}
[arrayOfRandomNumbers writeToFile:[self fileLocation] atomically:YES];
});
}
__block NSMutableArray *randomNumbers = nil;
//同步,读出文件, 排序 (因不在主线程中操作,不会阻塞主线程)
dispatch_sync(concurrentQueue, ^{
if ([self hasFileAlreadyBeenCreated]){
randomNumbers = [[NSMutableArray alloc] initWithContentsOfFile:[self fileLocation]];
[randomNumbers sortUsingComparator: ^NSComparisonResult(id obj1, id obj2) {
NSNumber *number1 = (NSNumber *)obj1;
NSNumber *number2 = (NSNumber *)obj2;
return [number1 compare:number2];
}];
}
});
//异步,在主线程中
dispatch_async(dispatch_get_main_queue(), ^{
if ([randomNumbers count] > 0){
NSLog(@"result:%@",randomNumbers);
/* Refresh the UI here using the numbers in the
randomNumbers array */
}
});
});
}
postscript:
arc4random():随机,不需要种子,返回的最大值0x100000000(4294967296)
RAND_MAX:随机,返回的最大值0x7fffffff(2147483647)
int value = arc4random() % x; //0 到x-1之间的整数
- GCD使用(二)执行与UI无关的操作
- GCD使用(一)执行与UI有关的操作
- IOS开发(60)之使用GCD执行UI操作
- IOS开发(61)之GCD执行非UI的操作
- GCD使用(三)执行延时操作
- GCD使用(四)操作只执行一次
- GCD开发笔记(二):GCD的使用
- GCD的介绍和使用(二)
- 使用Activity类的runOnUiThread执行线程更新UI操作
- 使用Activity类的runOnUiThread执行线程更新UI操作
- 一种与平台无关的开源UI框架
- iOS多线程的开发——GCD的使用与多线程开发浅析(二)
- iOS多线程开发——GCD的使用与多线程开发浅析(二)
- GCD 的使用与理解(1)
- GCD的使用与理解(2)
- GCD的介绍与使用(三)
- GCD的介绍与使用(四)
- GCD的介绍与使用(六)
- 完美解决IE不支持new Date()函数
- MySql的like语句中的通配符
- Java正则入门
- 玩转Android sqlLite---(附android DB的图行工具)
- 49 Android fragment 自定义适配器adapter
- GCD使用(二)执行与UI无关的操作
- 详解数据库Oracle 11g的基本安装
- 浏览器唯一识别标识
- 高质量的原创文章是网站的根本
- ispostback与postback
- 提高PHP编程效率的技巧
- 高质量链接的十大特点
- 高质量外部链接的十个标准
- [安卓开发]Socket通信莫名奇妙的退出