在我的视图控制器中,如果我监听2个不同的通知,但每次都会调用精确的选择器,如果选择器方法是一个长时间运行的方法,那么该方法会在其之前被其他通知中断。完成了,还是等等?
答案 0 :(得分:1)
答案是否定的,它不会打断它。我相信原因是当你的程序调用一个函数时,操作系统会为你在当前执行的语句下执行它分配一个全新的内存批量。 这是一个不使用NSNotification
的示例代码dispatch_after(4, dispatch_get_main_queue(), {
self.recieve()
})
dispatch_after(5, dispatch_get_main_queue(), {
self.recieve()
})
func recieve(){
println("here")
for index in 1...100000 {
println(index)
}
}
答案 1 :(得分:0)
NSNotifications
(默认情况下)在主NSOperationQueue
上传递,这是一个同步队列,因此一次只传递一个通知。所以不,在正常情况下你不会同时收到通知,他们会被排队机制序列化。
请注意,您可以通过创建自己的NSOperationQueue
来更改它,将maxConcurrentOperations
属性设置为非一个值,然后使用addObserverForName:object:queue:usingBlock:
答案 2 :(得分:0)
我还尝试了以下代码,它确认了我的答案。它确实按顺序调用
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sel1:) name:@"TEST" object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sel1:) name:@"TEST" object:nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"TEST" object:nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"TEST" object:nil];
}
-(void)sel1:(NSNotification *)noti{
NSLog(@"Sleeping1");
sleep(1);
NSLog(@"wakeing1");
}