面试题答案
一键面试-
定义新闻类型枚举:
typedef NS_ENUM(NSUInteger, NewsType) { NewsTypeSports, NewsTypeTech, NewsTypeEntertainment };
-
定义观察者协议:
@protocol NewsObserver <NSObject> - (void)newNewsAvailable:(NSString *)newsContent forType:(NewsType)type; @end
-
管理观察者列表:
- 创建一个
NewsPublisher
类来管理观察者列表。 - 使用
NSMutableDictionary
来存储不同类型新闻的观察者列表,键为NewsType
,值为NSMutableArray
,数组中存放实现了NewsObserver
协议的对象。
@interface NewsPublisher : NSObject - (void)addObserver:(id<NewsObserver>)observer forType:(NewsType)type; - (void)removeObserver:(id<NewsObserver>)observer forType:(NewsType)type; - (void)publishNews:(NSString *)newsContent forType:(NewsType)type; @end @implementation NewsPublisher { NSMutableDictionary<NSNumber *, NSMutableArray<id<NewsObserver>> *> *observerLists; } - (instancetype)init { self = [super init]; if (self) { observerLists = [NSMutableDictionary dictionary]; for (NSUInteger i = 0; i < 3; i++) { NSNumber *typeNumber = @(i); observerLists[typeNumber] = [NSMutableArray array]; } } return self; } - (void)addObserver:(id<NewsObserver>)observer forType:(NewsType)type { NSNumber *typeNumber = @(type); [observerLists[typeNumber] addObject:observer]; } - (void)removeObserver:(id<NewsObserver>)observer forType:(NewsType)type { NSNumber *typeNumber = @(type); [observerLists[typeNumber] removeObject:observer]; } - (void)publishNews:(NSString *)newsContent forType:(NewsType)type { NSNumber *typeNumber = @(type); NSArray<id<NewsObserver>> *observers = observerLists[typeNumber]; for (id<NewsObserver> observer in observers) { [observer newNewsAvailable:newsContent forType:type]; } } @end
- 创建一个
-
实现思路阐述:
- 添加观察者:
addObserver:forType:
方法将观察者添加到对应类型新闻的观察者列表中。 - 移除观察者:
removeObserver:forType:
方法从对应类型新闻的观察者列表中移除观察者。 - 发布新闻并通知观察者:
publishNews:forType:
方法获取对应类型新闻的观察者列表,然后遍历列表,调用每个观察者的newNewsAvailable:forType:
方法,高效地通知所有订阅该类型新闻的观察者。
- 添加观察者:
-
使用示例:
// 创建新闻发布者 NewsPublisher *publisher = [[NewsPublisher alloc] init]; // 创建一个观察者类并实现协议方法 @interface MyObserver : NSObject <NewsObserver> @end @implementation MyObserver - (void)newNewsAvailable:(NSString *)newsContent forType:(NewsType)type { NSString *typeStr = nil; switch (type) { case NewsTypeSports: typeStr = @"体育"; break; case NewsTypeTech: typeStr = @"科技"; break; case NewsTypeEntertainment: typeStr = @"娱乐"; break; } NSLog(@"收到 %@ 新闻: %@", typeStr, newsContent); } @end MyObserver *observer = [[MyObserver alloc] init]; // 订阅体育新闻 [publisher addObserver:observer forType:NewsTypeSports]; // 发布体育新闻 [publisher publishNews:@"湖人队赢得比赛" forType:NewsTypeSports]; // 移除观察者 [publisher removeObserver:observer forType:NewsTypeSports];