Không có gì sai với việc có một đại biểu cho một singleton là, nhưng nó tạo ra rất nhiều trường hợp cạnh đó bạn cần phải xử lý. Chẳng hạn như:
Nếu đối tượng A gọi setDelegate :, ngay sau đó setDelegate gọi đối tượng B: sau đó đối tượng A sẽ không bao giờ nhận cuộc gọi đại biểu.
Bạn cần kiểm tra xem bạn có phải là người được ủy quyền trước khi hủy ủy quyền của singleton hay không. Thông thường, trong số dealloc
, bạn gọi số singleton.delegate = nil;
. Nếu một đối tượng khác xảy ra để trở thành đại biểu sau khi bạn đã làm, sau đó bạn chỉ gây ra khiến họ bất ngờ ngừng được đại biểu.
Các đơn vị có đại biểu không phải là mẫu được thiết lập tốt. Giải pháp của bạn sẽ thay đổi tùy thuộc vào mức độ sử dụng của bạn. Dưới đây là một số giải pháp (theo thứ tự đơn giản nhất -> mạnh mẽ nhất).
Giữ nó đơn giản
Thiết kế ứng dụng của bạn để không bao giờ có nhiều đối tượng là đại biểu của singleton cùng một lúc (điều này có thể là không thể).
NSNotification
Sử dụng NSNotificationCenter để báo hiệu sự kiện thay vì đoàn. Xem một số câu trả lời khác được đăng trong chủ đề này.
Nhiều đại biểu
Mở rộng singleton của bạn để hỗ trợ nhiều đại biểu. Thay setDelegate:
với: addDelegate:
và removeDelegate:
@property (atomic) NSMutableArray *delegates;
- (void)addDelegate:(NSObject * <YourProtocol>)foo {
[self.delegates addObject:foo];
}
- (void)removeDelegate:(NSObject * <YourProtocol>)foo {
[self.delegates removeObject:foo];
}
- (void)signalDelegateEvent {
[self.delegates enumerateObjectsUsingBlock:^(id<YourProtocol> obj,
NSUInteger idx,
BOOL *stop) {
// call delegate method `foo` on each delegate
if ([obj respondsToSelector:@selector(foo)]) {
[obj foo];
}
}];
}
Tôi đã sử dụng mô hình đa đại biểu thành công trong nhiều ứng dụng. Hãy cẩn thận để suy nghĩ về cách đa luồng hiệu ứng mọi thứ nếu bạn chọn cách tiếp cận này.
Tại sao đại biểu không thành công? Thay vào đó, bạn có thể cân nhắc sử dụng 'NSNotificationCenter' cho nhiều người nghe. –
Tôi chỉ có một lớp mà tôi muốn thông báo, cập nhật ngữ cảnh câu hỏi ở trên – adit