2010-01-21 35 views
14

Tôi đang cố gắng để có được một ví dụ sử dụng NSNotificationCenter với addObserverpostNotificationName nhưng tôi không thể tìm ra lý do tại sao nó không hoạt động.NSNotification không được gửi khi postNotificationName: được gọi là

Tôi có 2 dòng mã để thêm người quan sát và gửi tin nhắn trong 2 lớp khác nhau

[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(newEventLoaded:) name:@"Event" object:nil]; 

[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self]; 

Nếu tôi đặt tên cho nil nó hoạt động tốt bởi vì nó chỉ là một phát sóng, khi tôi thử và xác định tên thông báo mà các tin nhắn không bao giờ có được.

Trả lời

12

Tất cả các mã của tôi tận dụng NSNotifications như vậy:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView) name:@"ScanCompleted" object:nil]; 

[[NSNotificationCenter defaultCenter] postNotificationName:@"ScanCompleted" object:nil]; 

Người đầu tiên được đăng ký thông báo và gửi bài thứ hai của thông báo.

+3

Đây chính xác là những gì tôi chưa từ chối làm việc, khiến tôi nghĩ rằng vấn đề ở nơi khác nhưng Trung tâm thông báo có vẻ khá tự hào về mã. Tôi không có một đầu mối nào khác để tìm kiếm những gì có thể gây ra vấn đề. Threading có thể? Liệu iPhone tự động đa luồng ở tất cả? Không phải là tôi biết. – Affian

+0

Tuyên bố NSLog trong bộ chọn (trong trường hợp của tôi updateView) có hoạt động đúng không? Nếu phương thức của bạn không có tham số nào, hãy thử tên phương thức mà không có: do đó, [[NSNotificationCenter defaultCenter] addObserver: tự chọn: @selector (newEventLoaded) tên: @ "Event" object: nil]; ' –

+0

Tất cả các thử nghiệm của tôi có được thực hiện với một NSLog trong phương thức được chọn và nó hoạt động khi tôi đặt tên của trình thông báo thành không. Tôi cũng đã thử nó cả hai có và không có tham số trong phương pháp – Affian

5

Thay đổi này:

[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self]; 

này:

[[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:nil]; 

Nếu thông báo đầu tiên của bạn đã được đăng ký đúng cách, newEventLoaded nên được gọi.

+1

Không may, tôi đã thử nhiều kết hợp giá trị đối tượng và giá trị sự kiện khác nhau. tài liệu. – Affian

+1

+1. Cảm ơn! Điều đó đã làm việc – Dexter

+0

+1 Điều này đã giúp tôi, cảm ơn –

1

Bạn đã thử bất kỳ tên nào khác nhưng @ "Sự kiện" và chưa? Chỉ cần chắc chắn, bạn có thể xác định tên sự kiện của mình trong một tệp và đưa tên đó vào cả đăng ký thông báo và gửi. Ví dụ:

header file: tập tin

extern NSString * const NOTE_myEventName; 

Nguồn:

NSString * const NOTE_myEventName = @"MyEventName"; 

đăng ký:

[[NSNotificationCenter defaultCenter] 
addObserver:self 
    selector:@selector(handleMyEvent:) 
     name:NOTE_myEventName 
     object:nil]; 

Thông báo gửi:

[[NSNotificationCenter defaultCenter] 
    postNotificationName:NOTE_myEventName object:nil]; 
1

Tôi cố định thành công của tôi "NSNotification không được gửi khi postNotificationName: gọi là" tai nạn.

Tôi phát hiện thấy lỗi thực sự nằm trong trình xử lý tin nhắn thông báo.

postNotificationNameaddObserver là tất cả các quyền như bài viết đầu tiên của chủ đề này.

+1

vấn đề với trình xử lý tin nhắn là gì? Và cách bạn sửa nó? – Meet

11

Về cơ bản, tất cả đều liên quan đến thứ tự thực thi. Nếu bạn đã thực thi postNotificationName trước addObserver, thì đây là một vấn đề dễ gặp phải.Sử dụng breakpoint và bước qua mã :)

breakpoint đầu tiên của bạn nên dừng lại ở đây:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateView:) name:@"ScanCompleted" object:nil]; 

Sau đó ở đây:

[[NSNotificationCenter defaultCenter]postNotificationName:@"ScanCompleted" object:self]; 

Ngoài ra, hãy chắc chắn rằng các selector có dấu hai chấm trên. Vì chữ ký của phương thức đó sẽ là:

- (void)updateView:(NSNotification *)notification; 
+0

Cảm ơn đã nhắc tôi rằng 'postNotificationName' được gọi trước' addObserver'. Nó giải quyết vấn đề của tôi. –

5

Tôi cũng gặp vấn đề tương tự. Lý do là tôi gọi phương pháp removeObserver tại

- (void)viewDidDisappear:(BOOL)animated{ 

    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 

    [notificationCenter removeObserver:self]; 

} 

Vì vậy, kiểm tra xem nếu bạn đã gọi removeObserver trước postNotification.

+1

Vui lòng sử dụng liên kết [chỉnh sửa] (http://stackoverflow.com/posts/27315932/edit) bên dưới câu trả lời của bạn để sửa định dạng mã. – nop77svk

+0

Điều tương tự cũng xảy ra với tôi. Thiếu một số mã đã thực sự loại bỏ tất cả các nhà quan sát sau khi tôi đã thêm người quan sát. Không ngạc nhiên khi nó không hoạt động. – AndyDunn

3

Tôi gặp sự cố tương tự và sự cố của tôi là do thông báo được gọi trên một chuỗi khác. Điều này giải quyết được vấn đề của tôi.

dispatch_async(dispatch_get_main_queue(),^{ 
    [[NSNotificationCenter defaultCenter]postNotificationName:@"Event" object:self]; 
}); 
+1

Cảm ơn bạn! Nó làm việc cho tôi. – Raja

Các vấn đề liên quan