iOS中通知非同步?同步?
讓人很納悶的一個問題:通知是同步的還是非同步的
在iOS開發中有人問“通知是同步的還是非同步的”。個人感覺問的這個問題本身就有問題,你只能說通知的執行方法是同步的還是非同步的,或者說傳送通知是同步的還是非同步的...對於通知是同步還是非同步,這個問法本身就很籠統,讓人不明白你是要問什麼,所以很納悶。
一個通知的小例子
這裡我們用一個簡單的小例子來看看通知的執行是在子執行緒還是在主執行緒。
1、 首先我們在viewDidLoad方法裡面註冊了一個通知:
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(test) name:kTestNotificationName object:nil];
}
通知的註冊者是self,執行方法是test,name是一個字元常量
static NSString *kTestNotificationName = @"TestNotification";
2、我們是在ViewController中測試的,借用touch方法來試試
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
dispatch_queue_t queue = dispatch_queue_create("CONCURRENT QUEUE", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
[[NSNotificationCenter defaultCenter] postNotificationName:kTestNotificationName object:nil];
NSLog(@"%@",[NSThread currentThread]);
});
}
這裡我們先寫了一個佇列CONCURRENT QUEUE,然後執行非同步任務。非同步任務裡面我們傳送通知。
3、test方法裡列印
- (void)test {
NSLog(@"test %@",[NSThread currentThread]);
}
4、列印結果
2017-08-07 16:55:16.987 Test[4333:191487] test <NSThread: 0x608000266e00>{number = 3, name = (null)}
2017-08-07 16:55:16.987 Test[4333:191487] <NSThread: 0x608000266e00>{number = 3, name = (null)}
- 列印結果顯示我們是在子執行緒中傳送的通知,則通知的執行方法也在子執行緒中執行。
- 如果將上述執行緒改成主執行緒中傳送通知的話,通知執行方法就會在主執行緒中執行,主執行緒中列印結果如下:
2017-08-07 17:16:08.164 Test[4472:200122] test <NSThread: 0x60000007d6c0>{number = 1, name = main}
2017-08-07 17:16:08.165 Test[4472:200122] <NSThread: 0x60000007d6c0>{number = 1, name = main}
完整例子如下:
#import "ViewController.h"
static NSString *kTestNotificationName = @"TestNotification";
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//註冊,主執行緒
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(test) name:kTestNotificationName object:nil];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//建立佇列
dispatch_queue_t queue = dispatch_queue_create("CONCURRENT QUEUE", DISPATCH_QUEUE_CONCURRENT);
//執行非同步任務
dispatch_sync(queue, ^{
[[NSNotificationCenter defaultCenter] postNotificationName:kTestNotificationName object:nil];
NSLog(@"%@",[NSThread currentThread]);
});
}
- (void)test {
NSLog(@"test %@",[NSThread currentThread]);
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self name:kTestNotificationName object:nil];
}
@end
例子中測試子執行緒中傳送通知,看通知方法是在哪個執行緒中執行;我們可以將非同步任務改成同步任務,看看在主執行緒中傳送通知,確認一下執行方法是在主執行緒。
總結
傳送通知是在哪個執行緒,則執行通知的方法就在哪個執行緒中執行。
對於有些人說“通知都是非同步的”,我想了想可能這指的是通知傳送後找註冊者的這個過程是非同步的吧?是不是這樣呢?
相關文章
- 同步非同步,阻塞非阻塞非同步
- 非同步、同步、阻塞、非阻塞非同步
- 同步、非同步、阻塞、非阻塞非同步
- 同步非同步 與 阻塞非阻塞非同步
- 理解阻塞、非阻塞、同步、非同步非同步
- 同步、非同步,阻塞、非阻塞理解非同步
- 同步、非同步、阻塞與非阻塞非同步
- 同步、非同步、阻塞和非阻塞非同步
- 非同步通知實驗非同步
- [轉]阻塞/非阻塞與同步/非同步非同步
- 同步與非同步 阻塞與非阻塞非同步
- 從同步原語看非阻塞同步以及Java中的應用Java
- 如何解讀 Java IO、NIO 中的同步阻塞與同步非阻塞?Java
- Socket程式設計中的同步、非同步、阻塞和非阻塞(轉)程式設計非同步
- 同步、非同步、阻塞、非阻塞的區別非同步
- 徹底搞懂同步非同步與阻塞非阻塞非同步
- IO - 同步 非同步 阻塞 非阻塞的區別非同步
- 同步、非同步、阻塞、非阻塞的簡單理解非同步
- 同步與非同步、阻塞與非阻塞的理解非同步
- java同步非阻塞IOJava
- 非同步和非阻塞非同步
- 支付系統之非同步通知非同步
- 驅動Driver-非同步通知非同步
- 同步阻塞、同步非阻塞、多路複用的介紹
- 大白話搞懂什麼是同步/非同步/阻塞/非阻塞非同步
- socket阻塞與非阻塞,同步與非同步、I/O模型非同步模型
- 網路IO之阻塞、非阻塞、同步、非同步總結非同步
- 如何給女朋友解釋什麼是IO中的阻塞、非阻塞、同步、非同步?非同步
- javascript中同步和非同步JavaScript非同步
- Linux裝置驅動之非同步通知和非同步I/OLinux非同步
- 怎樣理解阻塞非阻塞與同步非同步的區別?非同步
- 一篇文章讀懂阻塞,非阻塞,同步,非同步非同步
- ♻️同步和非同步;並行和併發;阻塞和非阻塞非同步並行
- ios ASIHttpLib 同步請求和非同步請求iOSHTTP非同步
- 【linux】驅動-14-非同步通知Linux非同步
- 非同步通知和MISC裝置驅動非同步
- 程式執行緒、同步非同步、阻塞非阻塞、併發並行執行緒非同步並行
- 聊聊執行緒與程式 & 阻塞與非阻塞 & 同步與非同步執行緒非同步