gpt4 book ai didi

ios - 键值观察外观类上的静态 NSDictionary

转载 作者:行者123 更新时间:2023-11-29 02:30:46 25 4
gpt4 key购买 nike

我有一个 ServiceFacade 类,其中包含用于与后端服务通信的类方法。在那个 ServiceFacade 类上,我有一个返回 NSMutableDictionary 的静态方法,我在其中保留当前 ServiceFacade 的下载操作。我想在 AppDelegate 或任何其他地方观察这个 NSMutableDictionary 的变化。 app delegate 似乎没有响应

- (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;
}

有什么想法吗?

最佳答案

无法观察到 NSMutableDictionary 的变化。但是有两种解决方法

1) 子类 NSMutableDictionary 并在 setObject:forKeyremoveObjectForKey 上触发通知。
2) 包装您的 _downloadOperations 写入/删除操作并在那里触发通知。

我建议你使用 2) 变体,因为子类化 NSMutableDictionary 不是那么容易。

因此 2) 变体将是这样的。
将这 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];
}

在此之后,您需要通过这 2 个方法在该字典中添加和删除对象。您还可以订阅更改

- (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);
}

关于ios - 键值观察外观类上的静态 NSDictionary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26909577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com