我有一个ServiceFacade
类,其中包含用于与后端服务进行通信的类方法。
在那个ServiceFacade
类上,我有一个返回NSMutableDictionary
的静态方法,其中我保留了当前ServiceFacade
的下载操作。
我希望在NSMutableDictionary
或其他任何地方观察此AppDelegate
的更改。应用代表似乎没有回应
- (void)addObserver:(NSObject *)anObserver
forKeyPath:(NSString *)keyPath
options:(NSKeyValueObservingOptions)options
context:(void *)context{
}
返回NSMutableDictionary的方法:
+(NSMutableDictionary *)downloadOperations
{
if (_downloadOperations)
{
return _downloadOperations;
}
[_downloadOperations addObserver:[AppDelegate sharedAppDelegate] forKeyPath:@"downloadOperationsDict" options:0 context:NULL];
_downloadOperations = [NSMutableDictionary dictionary];
return _downloadOperations;
}
有什么想法吗?
答案 0 :(得分:1)
无法观察NSMutableDictionary
更改。但有2个解决方法
1)子类NSMutableDictionary并触发setObject:forKey
和removeObjectForKey
上的通知。
2)包装_downloadOperations写入/删除操作并在那里触发通知。
我建议你使用2)变体,因为子类NSMutableDictionary
并不那么容易。
所以2)变体将是这样的。
将这两个方法添加到类ServiceFacade
- (void)setDownloadObject:(id)aObj forKey:(id<NSCopying>)aKey
{
[self.downloadOperations setObject:aObj forKey:aKey];
[[NSNotificationCenter defaultCenter] postNotificationName:@"DownloadOperationsChanged" object:self
userInfo:self.downloadOperations];
}
- (id)removeDownloadObjectForKey:(id<NSCopying>)aKey
{
[[self.downloadOperations] removeObjectForKey:aKey];
[[NSNotificationCenter defaultCenter] postNotificationName:@"DownloadOperationsChanged" object:self
userInfo:self.downloadOperations];
}
在此之后,您需要通过这两种方法添加和删除该字典中的对象。您还可以订阅更改
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(downloadOperationsChanged:)
name:@"DownloadOperationsChanged"
object:nil];
return YES;
}
- (void)downloadOperationsChanged:(NSNotification *)aNotification
{
NSLog(@"Operations : %@", aNotification);
}