iOS 多线程

分手后的思念是犯贱 2022-05-18 10:14 283阅读 0赞

iOS 多线程开发实现方式:

  1. NSThread

  2. NSOperation

3.GCD


1.NSThread, 轻量级多线程,需要自己管理声明周期

  • 创建线程方法

    // 1.Block方法创建 (iOS 10 之后可以使用)

    • (void)detachNewThreadWithBlock:(void (^)(void))block;

    // 2.直接将操作添加到新线程中并执行,该方法无法拿到线程对象
    // @param selector 方法名
    // @param target 调用对象
    // @param argument 参数

    • (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullable id)argument;

    // 3.创建线程对象,初始化线程任务,调用start方法启动线程
    // @param target 调用对象
    // @selector 方法名
    // @param argument 参数

    • (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullable id)argument;
  1. // eg:
  2. // 1. block 创建
  3. [NSThread detachNewThreadWithBlock:^{
  4. for (int i = 0; i < 100; i ++) {
  5. KLog(@"%d", i);
  6. }
  7. }];
  8. // 2. 直接将操作添加到新线程中并执行
  9. [NSThread detachNewThreadSelector:@selector(_threadSelector) toTarget:self withObject:nil];
  10. - (void)_threadSelector {
  11. KLogFunc;
  12. for (int i = 0; i < 100000; i ++) {
  13. KLog(@"----------------%d", i);
  14. }
  15. }
  16. // 3.创建线程对象,初始化线程任务, 调用start方法启动线程
  17. NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(_threadSelector) object:nil];
  18. - (void)_threadSelector {
  19. KLogFunc;
  20. for (int i = 0; i < 100000; i ++) {
  21. KLog(@"----------------%d", i);
  22. }
  23. }
  • 线程操作

    // 线程休眠

    • (void)sleepUntilDate:(NSDate *)date;// 让当前线程休眠到某个时间
    • (void)sleepForTimeInterval:(NSTimeInterval)time; // 让当前线程休眠多少秒
      // 终止线程
    • (void)exit;
      // 停止线程, 不会立即停止
    • (void)cancel;
  • 线程间通信

    // 1.在后台执行一个操作

    • (void)performSelectorInBackground:(SEL)selector withObject:(id)arg;

    // 2.在指定的线程执行一个方法,需要创建线程对象

    • (void)performSelector:(SEL)selector onThread:(NSThread *)thread withObject:(id)arg waitUntilDone:(BOOL)wait;

    // 3.在主线程执行一个操作

    • (void)performSelectorOnMainThread:(SEL)selector withObject:(id)arg waitUntilDone:(BOOL)wait;

    // eg:

    pragma mark - 添加响应方法触发创建子线程并加载数据

    • (void)touchesBegan:(NSSet )touches withEvent:(UIEvent )event
      {
      // 创建子线程
      [self performSelectorInBackground:@selector(loadImage) withObject:nil];
      }

    • (void)loadImage
      {
         NSLog(@”当前线程:%@”, [NSThread currentThread]);
         NSLog(@”主线程:%@”, [NSThread mainThread]);

      NSString *urlStr = @”https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1463455875&di=ef2da3f0fe711b471966aa1511483d0b&src=http://img4.duitang.com/uploads/item/201308/20/20130820094450_rsmYi.jpeg“;

      NSURL *url = [NSURL URLWithString:urlStr];

      NSURLRequest *request = [NSURLRequest requestWithURL:url];

      self.imageData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

      // 返回主线程,刷新UI
      [self performSelectorOnMainThread:@selector(reloadImageView) withObject:nil waitUntilDone:YES];
      }

    • (void)reloadImageView
      {
      // 进入主线程一般进行来安全判断
      if ([NSThread isMainThread]) {

      1. // 刷新UI
      2. UIImage *showIamge = [UIImage imageWithData:self.imageData];
      3. self.showImageView.image = showIamge;

      }
      }

NSOperation, NSOperationQueue 是苹果提供的一套多线程解决方案,基于GCD封装,完全面向对象

NSOperaion 是对任务的封装,封装好的任务交给NSOperationQueue进行串行队列和并行队列执行.这里的任务就是NSOperation类的一个方法,main方法或start方法,在NSOperation类中这两个方法是空实现,自定义NSOperation时需要重写.OC提供了子类(NSBlockOperation 和 NSInvocationOperation)实现多线程

  1. // 创建NSInvocationOperation
  2. NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(_operation) object:nil];
  3. // 创建线程队列
  4. NSOperationQueue *queue = [[NSOperationQueue alloc] init];
  5. // 设置最大并发线程数
  6. queue.maxConcurrentOperationCount = 4;
  7. // 添加到线程队列后,队列中的线程就会开始执行
  8. [queue addOperation:operation];
  9. - (void)_operation {
  10. for (int i = 0; i < 200000; i ++) {
  11. KLog(@"%d", i);
  12. }
  13. }
  14. // 创建NSBlockOperation
  15. NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
  16. for (int i = 0; i < 1000; i ++) {
  17. KLog(@"%d", i);
  18. }
  19. }];
  20. [[[NSOperationQueue alloc] init] addOperation:operation];

线程间依赖

  1. // NSOperationQueue 可以控制线程之间的依赖关系.
  2. - (void)test {
  3. // 创建线程队列
  4. NSOperationQueue *operaQueue = [[NSOperationQueue alloc] init];
  5. // 最大并发数
  6. operaQueue.maxConcurrentOperationCount = 5;
  7. NSBlockOperation *lastBlockOperation = [NSBlockOperation blockOperationWithBlock:^{
  8. NSLog(@"-----");
  9. }];
  10. // 创建多个线程
  11. for (int i = 0; i < 10; i ++) {
  12. NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
  13. NSLog(@"-----");
  14. }];
  15. // 设置依赖操作
  16. [blockOperation addDependency:lastBlockOperation];
  17. [operationQueue addOperation:blockOperation];
  18. }
  19. [operationQueue addOperation:lastBlockOperation];
  20. }

未完结

发表评论

表情:
评论列表 (有 0 条评论,283人围观)

还没有评论,来说两句吧...

相关阅读

    相关 IOS_线

    苹果的Cocoa框架支持的多线程机制有三中NSThread、GCD、NSOperation。 NSThread:是官方推荐的也是最基本的线程创建方式,但是需要开发这自己去管理

    相关 iOS线开发

    概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算。可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行。但是机器码是

    相关 ios 线

    iPhone 中的线程应用并不是无节制的,官方给出的资料显示iPhone OS下的主线程的堆栈大小是1M,第二个线程开始都是512KB。并且该值不能通过编译器开关或线程API函

    相关 iOS线总结

    1.iOS多线程总结 在iOS开发过程中,会遇到耗时操作或者多任务处理,为了能保证应用使用过程中的流畅性和发挥出多核优势,这个时候就会使用多线程。多线程可以发挥出多核的优