iOS 通知多线程的使用

简介: iOS 通知多线程的使用

一、通知使用的回顾



  • 1.1、通知使用一


  • 添加通知
/**
  添加通知
  observer:观察者
  aSelector:只要一监听到通知就会调用观察者这个方法
  aName:通知名称
  anObject:谁发出的通知或者是一些参数
  - (void)addObserver:(id)observer selector:(SEL)aSelector name:(nullable NSNotificationName)aName object:(nullable id)anObject;
 */
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(reciveNote) name:@"note" object:nil];
  • 发送通知


/**
  发送通知
  aName:通知名称
  anObject:谁发出的通知或者是一些参数
  - (void)postNotificationName:(NSNotificationName:)aName object:(nullable id)anObject;
 */
[[NSNotificationCenter defaultCenter]postNotificationName:@"note" object:nil];
  • 接收通知的消息


-(void)reciveNote:(NSNotification *)notify{
    NSLog(@"通知");
}
  • 移除通知


-(void)dealloc{
    [[NSNotificationCenter defaultCenter]removeObserver:self];
}
  • 1.2、通知使用二(block的通知)
  • 定义监听的返回值


@property (nonatomic, weak) id observe;
  • 添加通知
/**
  name:通知名称
  object:谁发出的通知
  queue:决定block在哪个线程执行,nil:在发布通知的线程中执行
  usingBlock:只要监听到通知,就会执行该blocl
  - (id <NSObject>)addObserverForName:(nullable NSNotificationName)name object:(nullable id)obj queue:(nullable NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
  注意:一定要移除通知
 */
self.observe = [[NSNotificationCenter defaultCenter]addObserverForName:@"note" object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
     // 只要监听到通知就会被调用
     NSLog(@"当前的线程=%@",[NSThread currentThread]);
     NSLog(@"%@",self);
}];
  • 发送通知


/**
  发送通知
  aName:通知名称
  anObject:谁发出的通知
  - (void)postNotificationName:(NSNotificationName)aName object:(nullable id)anObject;
 */
[[NSNotificationCenter defaultCenter]postNotificationName:@"note" object:nil];
  • 移除通知


[[NSNotificationCenter defaultCenter]removeObserver:self.observe];

注意:一定要移除通知


二、通知多线程的使用



  • 2.1、利用 1.1 的通知方式
  • 异步 添加通知


// 监听通知:异步
dispatch_async(dispatch_get_global_queue(0, 0), ^{
   [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(reciveNote:) name:@"note" object:nil];
});
  • 异步  发送通知


dispatch_async(dispatch_get_global_queue(0, 0), ^{
   [[NSNotificationCenter defaultCenter]postNotificationName:@"note" object:nil];
});

提示:接收通知的方法里面打印的是:子线程


  • 同步  发送通知


dispatch_sync(dispatch_get_global_queue(0, 0), ^{
   [[NSNotificationCenter defaultCenter]postNotificationName:@"note" object:nil];
});

提示:接收通知的方法里面打印的是:主线程


  • 接收通知的消息


-(void)reciveNote:(NSNotification *)notify{
   NSLog(@"当前接收通知的线程=%@",[NSThread currentThread]);
}

提示:很多时候我们可能不知道发送通知的线程,我们需要在接收通知的方法里面进行更新UI,我们可以在接收方法里面使用主线程,如下

-(void)reciveNote:(NSNotification *)notify{
    NSLog(@"当前接收通知的线程=%@",[NSThread currentThread]);
    dispatch_sync(dispatch_get_main_queue(), ^{
          // 在此刷新UI
    });
}
  • 移除通知


-(void)dealloc{
   [[NSNotificationCenter defaultCenter]removeObserver:self];
}
  • 结论不管添加通知在主线程还是子线程,接收通知的方法所在的线程是由发送通知的线程决定的。


  • 2.2、利用 1.2 的通知方式:和上面的一样,我直接说有关刷新的问题


self.observe = [[NSNotificationCenter defaultCenter]addObserverForName:@"note" object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
      // 只要监听到通知就会被调用
      NSLog(@"当前的线程=%@",[NSThread currentThread]);
      NSLog(@"%@",self);
}];
  • 分析:如果上面的是:queuenil,那么block里面的线程是由发送通知的线程决定,那么如果block里面是子线程我们就无法刷新UI了,解决办法是把 nil 改为 [NSOperationQueue mainQueue],不管发送通知的线程是什么,block里面都是主线程,如下


self.observe = [[NSNotificationCenter defaultCenter]addObserverForName:@"note" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
    // 只要监听到通知就会被调用
    NSLog(@"当前的线程=%@",[NSThread currentThread]);
}];


最后这是调试的 demo

目录
相关文章
|
25天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
29天前
|
API Android开发 iOS开发
深入探索Android与iOS的多线程编程差异
在移动应用开发领域,多线程编程是提高应用性能和响应性的关键。本文将对比分析Android和iOS两大平台在多线程处理上的不同实现机制,探讨它们各自的优势与局限性,并通过实例展示如何在这两个平台上进行有效的多线程编程。通过深入了解这些差异,开发者可以更好地选择适合自己项目需求的技术和策略,从而优化应用的性能和用户体验。
|
2月前
|
安全 调度 数据安全/隐私保护
iOS线程锁
iOS线程锁
31 0
|
3月前
|
API Android开发 iOS开发
安卓与iOS开发中的线程管理对比
【9月更文挑战第12天】在移动应用的世界中,安卓和iOS平台各自拥有庞大的用户群体。开发者们在这两个平台上构建应用时,线程管理是他们必须面对的关键挑战之一。本文将深入探讨两大平台在线程管理方面的异同,通过直观的代码示例,揭示它们各自的设计理念和实现方式,帮助读者更好地理解如何在安卓与iOS开发中高效地处理多线程任务。
|
4月前
|
安全 测试技术 调度
iOS开发-多线程编程
【8月更文挑战第12天】在iOS开发中,属性的内存管理至关重要,直接影响应用性能与稳定性。主要策略包括:`strong`(强引用),保持对象不被释放;`weak`(弱引用),不保持对象,有助于避免循环引用;`assign`(赋值),适用于基本数据类型及非指针对象类型;`copy`(复制),复制对象而非引用,确保不变性。内存管理基于引用计数,利用自动引用计数(ARC)自动管理对象生命周期。此外,需注意避免循环引用,特别是在block中。最佳实践包括理解各策略、避免不必要的强引用、及时释放不再使用的对象、注意block中的内存管理,并使用工具进行内存分析。正确管理内存能显著提升应用质量。
|
4月前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享安卓与iOS开发中的线程管理比较
【8月更文挑战第30天】本文将探讨网络安全与信息安全的重要性,并分享关于网络安全漏洞、加密技术和安全意识的知识。我们将了解常见的网络攻击类型和防御策略,以及如何通过加密技术和提高安全意识来保护个人和组织的信息安全。
|
4月前
|
编译器 C语言 iOS开发
iOS 16 系统键盘修复问题之确定_lock是否用于保护对_deferredTasks的多线程读写如何解决
iOS 16 系统键盘修复问题之确定_lock是否用于保护对_deferredTasks的多线程读写如何解决
|
iOS开发
iOS多线程之NSOperationQueue-依赖、并发数、优先级、自定义Operation等最全的使用总结
iOS多线程之NSOperationQueue-依赖、并发数、优先级、自定义Operation等最全的使用总结
511 0
|
7月前
|
iOS开发
多线程和异步编程:解释 iOS 中的同步和异步任务的概念。
多线程和异步编程:解释 iOS 中的同步和异步任务的概念。
149 1
|
7月前
|
API 调度 iOS开发
多线程和异步编程:什么是 GCD(Grand Central Dispatch)?如何在 iOS 中使用 GCD?
多线程和异步编程:什么是 GCD(Grand Central Dispatch)?如何在 iOS 中使用 GCD?
95 1