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

标签 ios objective-c observer-pattern nsmutabledictionary key-value-observing

我有一个 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/

相关文章:

objective-c - Objective-C 的命名空间约定

java - 尝试构建一个简单的 Observer-Observable

java - Android 单个观察者,在不同的类中有多个订阅者

ios - 问题 : TMS-90809: Deprecated API Usage - Apple will stop accepting submissions of apps that use UIWebView APIs

objective-c - 有什么方法可以识别 iDevice 用户吗?

ios - iOS通用链接不起作用

ruby-on-rails - rails : Use URL Helper in Observer

ios - 当应用程序在前台时检测用户何时点击通知

objective-c - EXC_BAD_ACCESS 委托(delegate)崩溃

iphone - 像默认的 MessageComposer 一样将联系人/号码添加到 Textview/文本字段中