《iOS-最全的App上架教程》,队列并不是线程

2019-09-17 作者:编程   |   浏览(78)

GCD(Grand Central Dispatch)是iOS多义务的骨干,它能够让程序员不用直接参加到线程的制造和尊崇中,而让操作系统来间接管理线程的始建和治本,让多职务的支出越发简便易行。

她是三个抽象类,能够与NSOperationQueue结合实现三十二线程操作。要利用NSOperation,须求贯彻它的子类:NSInvocationOperation、NSBlockOperation和自定义类。

起标题要低调点,不欣赏这种用标题来骗小朋侪进来刷流量,默默的走心就好了。喜欢的后生伴点个爱好哦。。。

图片 1I love you not because of who you are,but because of who I am when I am with you

在GCD中,操作正是七个代码块,而队列(dispatch_queue)便是寄存那些操作的地点,要小心,队列而不是线程,队列是集体操作的,调用dispatch_async并不会让操作起来施行,而只是把操作增多到行列的结尾,当操作到达队列头时,操作才会开端实践。加多到行列中的操作无法撤销。

贯彻思路

始建NSOperationQueue队列对象执行操作①start初叶:一律在主线程中齐声实施②参与队列,自动异步并发实行

图片 2对比

想要上架的同校请看:《iOS-最全的App上架教程》

创立队列

使用dispatch_queue_create(constchar *label,dispatch_queue_attr_t attr)来创制队列,第三个参数是队列的标示符,第一个参数则钦命队形是串行队列(DISPATCH_QUEUE_SERIAL)还是并发队列(DISPATCH_QUEUE_CONCURRENT),不管是串行队列照旧出现队列,队列中的操作都采纳FIFO的不二等秘书籍收取实行,差异的是并发队列可以将队列中的多少个操作收取并置于不一样的线程中实行。

1.2 NSInvocationOperation

  • 假定直白动用start方法,那么操作会在主线程中共同奉行,不会创设罗山县城

  • 例如参加队列,操作会异步并发实践,会开垦新线程

     -viewDidLoad { //1 实例化队列 NSOperationQueue *queue = [[NSOperationQueue alloc]init]; //2 创建操作 NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector object:nil]; //3.1手动开始 //[operation start]; //3.2加入队列自动开始 [queue addOperation:operation]; } //下载任务 -download { NSLog(@"正在下载图片---%@",[NSThread currentThread]); }
    
#import <pthread.h>// 创建pthread_t thread;pthread_create(&thread, NULL, run, NULL);void * run(void *param){ // 耗时操作 return NULL;}

// 创建1.NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector object:@"jack"];thread.name = @"my-thread";[thread start];// 创建2.[NSThread detachNewThreadSelector:@selector toTarget:self withObject:@"rose"];// 创建3.[self performSelectorInBackground:@selector withObject:@"jack"];// 耗时操作- run:(NSString *)param{}// 其他[NSThread sleepForTimeInterval:2]; // 让线程睡眠2秒[NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2]];[NSThread sleepUntilDate:[NSDate distantFuture]];// 睡到死。。[NSThread exit]; // 直接退出线程[NSThread currentThread]; // 当前线程[NSThread mainThread]; // 主线程// 加锁 ,互斥锁,缺点需要消耗大量的CPU资源// 线程同步@synchronized { // 需要锁定的代码}// 延迟执行[self performSelector:<#(nonnull SEL)#> withObject:nil afterDelay:<#(NSTimeInterval)#>];// 线程通讯// 回到主线程,显示图片[self.imageView performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:NO];[self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];[self performSelectorOnMainThread:@selector(showImage:) withObject:image waitUntilDone:YES];// YES 是等完事,向下走 NO就是不等,直接走- showImage:(UIImage *)image{ self.imageView.image = image;}
因为前段时间立异了Xcode 8 ,证书的创制都完全同样,只是在Xcode 第88中学的设置有部分浮动,小编就在上面补充,如有啥疑点,请联系小编。。

一样能够在Build Setting 的 sign中安装证书,可是有个别麻烦,提出就在General中装置证书,相比方便,还足以查看错误的地点。

图片 3444444444.png

获得队列

能够选取dispatch_get_main_queue()得到主队列,主队列是一个串行队列,队列中的全数操作都以在主线程中实践的;系统中设有有大局并发队列,使用dispatch_get_global_queue(long identifier, unsigned long flags)获取大局并发队列,使用第多个参数接纳优先级:

#define DISPATCH_QUEUE_PRIORITY_HIGH 2 #define DISPATCH_QUEUE_PRIORITY_DEFAULT 0#define DISPATCH_QUEUE_PRIORITY_LOW  #define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

GCD会依附可用线程尽也许的从高优先级队列取出操作并推行,等高优先级队列空了以往,继续从默许优先级队列中抽出操作并试行,由此及彼。

操作有三种实践办法:协助举行实行异步推行。使用dispatch_sync(dispatch_queue_t queue, dispatch_block_t block)开展协同实施操作,使用dispatch_async(dispatch_queue_t queue,dispatch_block_t block)开展异步实行操作。使用异步实践操作,系统会将block增加到行列queue中,而只要选拔同步实施操作,系统则会先堵塞当前的线程,再将block增加到行列queue中,等block推行完了,当前线程才会吊销阻塞。必要小心同步施行很轻便晤面世死锁的境况:

dispatch_sync(dispatch_get_main_queue(), ^{ //同步执行 NSLog;});

这段代码看似没不正常,但假诺当前线程是主线程的话,则会先堵塞主线程,等待block施行完,而block却是在主线中施行的,所以block中的代码长久不会被实行,何况主线程也会被直接不通。

1.3 NSBlockOperation

实现思路:①创立队列 ②创制操作 ③参与队列义务封装在block中。自动并发实施

- viewDidLoad { [super viewDidLoad]; //1 创建队列 NSOperationQueue *queue = [[NSOperationQueue alloc]init]; //2.1 创建操作1 NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"任务1-正在下载图片1----%@",[NSThread currentThread]); }]; //2.2 创建操作2 NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"任务1-正在下载图片2----%@",[NSThread currentThread]); }]; //2.3 创建操作3 NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"任务1-正在下载图片3----%@",[NSThread currentThread]); }]; //3.1 加入队列方式1 [queue addOperation:operation1]; //3.2 加入队列方式2 [queue addOperations:@[operation2,operation3] waitUntilFinished:YES];}

也能够同一个操作中增加七个职分,各样职务也得以异步并发执行。使用addExecuteionBlock:方法来增多任务。

- viewDidLoad { [super viewDidLoad]; //1 创建队列 NSOperationQueue *queue = [[NSOperationQueue alloc]init]; //2 创建操作1 NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"任务1-正在下载图片1----%@",[NSThread currentThread]); }]; //3 继续添加任务到操作 [operation1 addExecutionBlock:^{ NSLog(@"任务2-正在下载图片2----%@",[NSThread currentThread]); }]; //4 将操作加入队列 [queue addOperation:operation1];}

图片 4对比

准备

  • 开垦者账号

从今Xcode7 出来现在,一般的真机测量检验不要求开荒者账号,也就无需看那篇教程,独有app具有“推送”等效用的时候,要真机测验就必必要开拓者账号和安装证书。苹果只是令你体验一下它的基本功用,要深深照旧要花钱的。

  • 待测量试验的项目
  • 一、创建App ID
  • 二、创制证书央浼文件
  • 三、根据CSLacrosse创造开辟者证书(开辟、测量检验用的Develope证书)
  • 四、增添配备
  • 五、根据Devices创造Provisioning Profiles配置文件
  • 六、设置Xcode 然后真机调节和测量试验

本文由小鱼儿玄机30码发布于编程,转载请注明出处:《iOS-最全的App上架教程》,队列并不是线程

关键词: 小鱼儿玄机30码