2012-06-29 23 views
9

Tôi có đoạn mã sau:NSNotificationCenter một bài gây quan sát được gọi là hai lần

[[NSNotificationCenter defaultCenter] postNotificationName:kNewsfeedFetchCompleted object:self userInfo:userinfo]; 

chỉ này, không có nơi nào khác. Và dưới đây là cách tôi đặt người quan sát:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newsfeedFetchCompleted:) name:kNewsfeedFetchCompleted object:nil]; 

câu hỏi là khi tôi làm một bài các newsfeedFetchCompleted được gọi là hai lần .. thế nào là này thậm chí có thể?

+0

[[NSNotification defaultCenter] removeObserver: self] – janusbalatbat

+0

ý của bạn là gì? tại sao tôi nên làm điều đó? – xonegirlz

+2

AddObserver có thể được gọi nhiều lần cho cùng một đối tượng, dẫn đến nhiều thông báo. Bạn đang gọi addObserver ở đâu? –

Trả lời

23

Điều này có thể xảy ra khi mã của bạn cho addObserver được thực thi hai lần. Chức năng thông báo sẽ được gọi bao nhiêu lần khi nó được đăng ký.

Vì vậy, hãy đảm bảo mã của bạn để thêm người quan sát được thực thi chỉ một lần duy nhất. Vì vậy, bạn có thể giữ nó trong phương thức viewDidLoad hoặc init.

Nếu bạn đang đặt nó trong chế độ xemWillAppear thì hãy xóa người quan sát trong chế độ xemWillDisAppear.

+0

Tôi thực sự thêm điều này trong initWithNib tên – xonegirlz

+0

Trong trường hợp đó, khi bạn đang deallocating rằng xemcontroller, bạn đã bỏ lỡ removeObserver trong dealloc phương pháp. – Apurv

+0

Vì vậy, nếu bộ điều khiển xem được tạo lần thứ hai, người quan sát của bạn sẽ được đăng ký lại và chức năng sẽ được gọi hai lần. – Apurv

2

Có thể nếu bạn đã thêm cùng một người quan sát nhiều lần cho thông báo newsfeedFetchCompleted. Bạn nên kết hợp các cuộc gọi addObserver của bạn với các cuộc gọi removeObserver.

Ví dụ: nếu bạn thêm người quan sát trong chế độ xemWillAppear/viewWillDidAppear/ViewDidLoad của UIViewController, bạn nên xóa nó trong chế độ xemWillDisappear/viewDidDisappear/ViewDidUnload.

Cuộc gọi remove tương ứng cho addObserver, là removeObserver:name:object:

Thông tin thêm có thể được tìm thấy trong NSNotificationCenter docs

8

trước khi bạn thêm quan sát viên, chắc chắn bạn loại bỏ các quan sát trước đó nói thêm.

[[NSNotificationCenter defaultCenter]removeObserver:self]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(newsfeedFetchCompleted:) name:kNewsfeedFetchCompleted object:nil]; 
+1

Điều này sẽ có nhiều phiếu bầu hơn. Thực sự đã giúp tôi khắc phục vấn đề mà phương pháp của tôi đã được gọi quá nhiều lần. –

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