iOS多线程浅析

本文介绍了iOS开发中的多线程概念,包括同步、异步和并发,并通过网络请求的例子进行说明。同步执行可能导致线程阻塞,而异步则不阻塞,允许并发执行多个任务。在iOS中,网络请求通常在子线程完成,然后需要将数据更新到主线程。文中推荐使用GCD处理这种情况,因为NSThread和NSOperation使用相对复杂。同时,讨论了在特定场景下同步操作的必要性,并通过对比AFNetworking和NSURLConnection解决同步初始化问题的优缺点。
摘要由CSDN通过智能技术生成

首先需要我们明确几个概念:同步、异步和并发

这里以一个网络请求来举例,也是我们平时用到多线程比较多的地方 

同步:同步执行,所有的任务在同一个线程中执行。在ios中,UI的刷新都是在主线程操作的,如果你有一个网络请求,在网络请求的时间里就无法操作UI,因为线程被阻塞了

异步:异步就是把网络请求放到了子线程中。便不会阻塞线程,你在等待网络请求数据的过程中,仍然可以点击按钮等空间

并发:并发可以理解为异步的升级版。如果同时有n个任务,并发可以让这几个任务同时执行,最后需要的时间是耗时最长的那个任务

这里就有一个问题,我们一般的需求是:执行网络请求,请求到数据以后,把数据展示到页面上。 异步请求完成后,怎么回到主页面呢?

这里有三种方法:

1、NSThread
- ( void ) updateUIWith: (UIColor *)color{ [self.bottomView setBackgroundColor: color];}[self performSelectorOnMainThread: @selector( updateUIWith: ) withObject: [UIColor purpleColor] waitUntilDone: YES modes: [NSArray arrayWithObject: (__bridge NSString*)kCFRunLoopCommonModes]];
2、NSOperationQueue方式
NSOperationQueue 是iOS封装的多线程类,可以用类方法直接调用得到程
[[NSOperationQueue mainQueue] addOperationWithBlock:^{ [self.bottomView setBackgroundColor:[UIColor redColor]] ; }];
3、GCD方式
dispatch_async(dispatch_get_main_queue(), ^{ [self updateUIWith:[UIColor greenColor]]; });

这里推荐使用GCD方式,NSThread和NSOPeration使用起来比较繁琐而且不容易理解

当然我们也并不是不需要同步,比如今天需要我初始化对象时,其中一个属性从网络请求中获取

一开始我是用了AFNetworking,但是AFNetworking里的success是return以后执行的,就无法达到要求。

因为AFNetworking自动使用了异步操作。在函数中会把代码压入栈中,最后压入success和failure中的代码,所以这两个代码块总是最后执行的

最后使用了最原始的NSURLConnection,来完成了需求,但是性能受到影响,如果要初始化的对象特别多便会卡顿

- (instancetype)initWithArr:(NSArray *)arr {
    if(self = [super init]) {
        
        ....
        _isVideo.integerValue == 1) {// 是视频
            _size = [self getVideoSize:_fileUrl];
            NSLog(@"pic size:%f,%f",_size.width,_size.height);
            _heightToWidth = _size.height/_size.width;
           
          ....  
        }
    }
    return self;
}


// 获取视频缩略图的尺寸
- (CGSize)getVideoSize:(NSString *)videoUrl {
    // 设置请求路径
    NSURL *url = [NSURL URLWithString:[videoUrl stringByAppendingString:@"?avinfo"]];
    NSURLRequest *urlRequest = [NSURLRequest requestWithURL:url];
    // 创建同步网络请求
    NSData *syncNetData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:nil];
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:syncNetData options:0 error:nil];
  通过json获取size
    return size;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Quasimodor

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值