应用有一个简单的需求,即在后台做文件下载等一系列操作,过程中在主页面刷新进度条,全部完成后弹出对话框提示用户
这个需求显然必须用到多线程,在网上搜索了一番,在ios里实现多线程主要有3种方式:
1、NSThread,以及在此基础上封装的performSelector方法,如performSelectorInBackground和performSelectorOnMainThread等简便方法
2、NSOperation,这个方式我从来没用过,不了解
3、GCD,今天我改成了这个实现方式,本文主要总结关于GCD的用法
NSThread的缺点
本来我是用NSThread + Notification来实现线程切换,不过随着UI变得复杂,代码也越来越不清晰了。主要是NSThread有以下几个缺点:
1、经常需要配合Notification一起使用,如果流程比较复杂,系统中会有很多事件,理解起来很不直观
2、performSelector方法的参数,只能接受SEL,不能传递block进去,所以系统中需要很多“跳板方法”
3、侦听事件的方法,只能接受一个参数即notification,然后取出userInfo,类型也限定为NSDictionary,复杂交互时,传参很不方便
GCD
相比之下,GCD可以克服上面的几个问题,不需要配合notification就能工作,而且block可以形成闭包,传参也很方便
更重要的是,GCD是apple官方推荐的方式,所以很多第三方组件都是用GCD来实现的,应用使用GCD有时候就可以和第三方组件很好地配合
示例代码
我今天才刚开始接触,对API也了解得不全,主要有4个函数比较常用,可以满足一般的场景了(GCD的API是C风格,不是objective-c风格)
dispatch_async()和dispatch_sync,就是开启新线程的API,前者是立刻返回,不阻塞当前线程;后者则是同步调用,会阻塞当前的线程,所以在UI Thread里,要小心调用dispatch_sync()函数
这2个函数都接受2个参数,第1个是线程,第2个是block。block就不用多解释了,为了传第1个参数,就用到下面2个API
dispatch_get_global_queue,dispatch_get_main_queue,前者是整个进程(应用)共享的子线程,后者就是UI Thread,我感觉使用这4个API,就足够应付一般的需求了
下面贴一段示例代码:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
BOOL needBackup = [self.backupDelegate checkNeedBackup];// 跑在子线程
dispatch_async(dispatch_get_main_queue(), ^(void){
if(needBackup){
UIAlertView *confirmBackupAlert = [[UIAlertView alloc] initWithTitle:nil message:NSLocalizedString(@"backup_confirm_alert_view_message", @"") delegate:mainViewDelegate cancelButtonTitle:NSLocalizedString(@"button_cancel", @"") otherButtonTitles:NSLocalizedString(@"button_confirm", @""), nil];
confirmBackupAlert.tag = ALERT_TAG_CONFIRM_BACKUP;
[confirmBackupAlert show];
}else{
UIAlertView *noNeedBackupAlert = [[UIAlertView alloc] initWithTitle:nil message:NSLocalizedString(@"backup_no_need", @"") delegate:mainViewDelegate cancelButtonTitle:NSLocalizedString(@"button_iknow", @"") otherButtonTitles:nil];
noNeedBackupAlert.tag = ALERT_TAG_BACKUP_NO_NEED;
[noNeedBackupAlert show];
}
});
});
在子线程做费时操作,比如HTTP请求和数据库访问等,然后切换回主线程,弹出AlertView
好链接
下面2个链接都很不错:
ios中消息的传递机制
51CTO多线程专题
分享到:
相关推荐
iOS多线程编程之Grand Central Dispatch(GCD)使用,卖票的例子来讲NSThread的线程同步,使用了两种锁,一种NSCondition ,一种是:NSLock,还有加了一个 线程3 去唤醒其他两个线程锁中的wait,里面的注释很已经写的...
iOS常见的多线程:GCD 任务和队列,异步执行 + 并发队列,线程锁,信号量
这是一份有关IOS GCD多线程的代码,有助于理解IOS多线程的理解与掌握
ios多种多线程代码,简单易懂,ios新手必备。希望大家能共同进步
NULL 博文链接:https://zhangmingwei.iteye.com/blog/1747606
iOS开发多线程,NSoperetion, GCD,多线程的网络图片的下载
ios多线程开发的常用四种方式和基本使用,pthread、NSThread、NSOperation\NSOperationQueue、GCD
iOSGCD控制多线程任务数量,直接使用ZKRGlobalQueue^()。
#iOS的三种多线程技术 和特性 1.NSThread 2.NSOperation/NSOperationQueue 3.GCD (大中心调度)
这里介绍了多线程的详细图解 欢迎您进行下载参考!!!!!
关于iOS 多线程编程知识点,iOS 多线程 NSThread NSOperation GCD
这里详细介绍了iOS多线程 NSThread,GCD,NSOperation的使用。看我就够了!
iOS中多线程原理与runloop介绍
用gcd做IOS多线程,基本使用方法,多线程+block更加方便!
iOS开发中,有两种常用的方法可以实现延迟执行,一种是使用GCD,另外一种是使用NSRunLoop类中提供的方法。 前言 对初学者来说,GCD似乎是一道迈不过去的坎,很多人在同步、异步、串行、并行和死锁这几个名词的漩涡中...
Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法。 dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取。 #definedispatch_get_main_queue() \DISPATCH...
操作系统:LInux、IOS、树莓派、安卓开发、微机操作系统、网络操作系统、分布式操作系统等。此外,还有嵌入式操作系统、智能操作系统等。 网络与通信:数据传输、信号处理、网络协议、网络与通信硬件、网络安全网络...
Grand Central Dispatch (GCD)是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现。...也就是说,GCD用我们难以置信的非常简洁的记述方法,实现了极为复杂的多线程编程。
iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD
《Objective-C 高级编程:iOS与OS X多线程和内存管理》详细介绍了MacOX和iOS开发上的关于内存管理ARC和多线程GCD、Blocks的技术。