Thực tế có một gottcha; bạn sẽ sụp đổ ngẫu nhiên! Đó là kinh nghiệm của tôi. Điều này phải làm với thực tế là đối tượng nhận được thông báo thực hiện trên cùng một luồng với người gửi thông báo.
Từ Apple iOS Documentation on Notification Centers:
Trong một ứng dụng đa luồng, thông báo luôn giao trong thread trong đó thông báo đã được đăng, mà có thể không được như vậy chủ đề trong đó một người quan sát đăng ký chính nó.
Điều này chắc chắn sẽ khiến bạn đau đầu.
Nếu thông báo đang được nhận bởi một cái gì đó trên chủ đề chính, tôi đã tìm thấy rằng popping vào chủ đề chính từ chủ đề nền để phát hành một thông báo là cách an toàn nhất để đi về điều này. Nó là khá đơn giản để làm:
//Call this to post a notification and are on a background thread
- (void) postmyNotification{
[self performSelectorOnMainThread:@selector(helperMethod:) withObject:Nil waitUntilDone:NO];
}
//Do not call this directly if you are running on a background thread.
- (void) helperMethod{
[[NSNotificationCenter defaultCenter] postNotificationName:@"SOMENAME" object:self];
}
Thật không may này giới thiệu một khớp nối tinh tế giữa người gửi và người nhận ở chỗ bạn đang thay đổi người gửi để thích ứng với người nhận.
Một giải pháp thậm chí tốt hơn, như XJones chỉ ra, là để người gửi gửi thông báo về bất kỳ chủ đề nào nó quyết định, và sau đó làm cho người nghe chịu trách nhiệm sử dụng chuỗi thích hợp để thực hiện bất kỳ hành động nào cần.
Hy vọng điều đó hữu ích.
Tôi đã tham chiếu vấn đề này trong một bình luận trong câu trả lời của tôi. Tôi không thích giải pháp của bạn chính xác b/c của khớp nối giữa đối tượng đăng thông báo và người quan sát. Các đối tượng gửi bài nên đăng trên bất cứ chủ đề nó thích. Người nhận phải xử lý thông báo trên chuỗi mà nó cần (ví dụ: người nhận có thể chuyển tiếp thông báo đến chủ đề chính hoặc bất kỳ chủ đề nào khác). Apple cũng sử dụng phương pháp này trong mã mẫu của nó. – XJones
Tôi hoàn toàn đồng ý. Tôi đã cập nhật câu trả lời của mình để phản ánh phương pháp này. – PixelCloudSt
@PixelCloudSt Tôi hiểu các khớp nối trong phương pháp này, nhưng làm thế nào tôi sẽ đi về làm cho người nhận lắng nghe trên nhiều chủ đề? –