键值观察Facade类上的静态NSDictionary

时间:2014-11-13 13:04:30

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

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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

无法观察NSMutableDictionary更改。但有2个解决方法

1)子类NSMutableDictionary并触发setObject:forKeyremoveObjectForKey上的通知。
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);
}