在NSDictionary / NSCache中存储键/值,它会保留数据直到应用程序终止

时间:2016-01-18 10:48:05

标签: ios objective-c iphone

我有一个应用程序,我想创建一个存储密钥和值的临时缓存。我做了以下

我的代码是:IN appDelegate.h

@property (strong, nonatomic) NSMutableDictionary *articleCache;

在appDelegate.m

@synthesize articleCache;

我在viewController.m中调用它 在这里,我需要存储数据,以便仅在应用程序终止时清除它,否则可以在应用程序的任何位置访问。 每次我访问一篇文章时,我都会将它添加到数组中,这样下次我就不必从网络中获取它,从而加快了这个过程。

问题是,当我设置临时NSMutableDictionary时,内容被添加但是对于checkCache.articleCache,我得到nil。

#define DELEGATE ((AppDelegate*)[[UIApplication sharedApplication]delegate])

这是我的viewDidLoad方法:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    //[self loadfeeds];
    [self.activityIndi startAnimating];
    AppDelegate *checkCache = DELEGATE;
    NSString *link = self.webUrl;

//check if the article is already opened and cached before

    if([[checkCache.articleCache allKeys] containsObject:link])
    {
        NSLog(@"Key Exists");
        NSString *contents = [checkCache.articleCache valueForKey:link];
        [self loadDataOnView:contents];
    }
    else
    {
        NSOperationQueue* aQueue = [[NSOperationQueue alloc] init];
        [aQueue addOperationWithBlock:^{
            NSLog(@"Key not Exists");
            [self startParsing];
        }];
    } 
}

在最后的解析器方法中,我执行以下操作,即存储文章.. 但如果我直接将它添加到checkCache.articleCache没有添加任何内容我该怎么办?但它被添加到临时..我是否正确访问articleCache ??

AppDelegate *checkCache = DELEGATE;
NSMutableDictionary *temp = [[NSMutableDictionary alloc] init];
    [checkCache.articleCache setObject:Content forKey:url];
    [temp setObject:Content forKey:url];

那我怎么解决呢? 或建议我如何使用NSCache来解决同样的问题。非常感谢。 这可能是一个愚蠢的问题,但我对ios很感谢。

1 个答案:

答案 0 :(得分:1)

在App代理中:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.articleCache = [NSMutableDictionary new];
return YES;
}

当你必须在缓存中设置对象时。

AppDelegate *checkCache = DELEGATE;
[checkCache.articleCache setObject:obj forKey:@"Key1"];

要取回物品:

AppDelegate *checkCache = DELEGATE;
id obj = [checkCache.articleCache objectForKey:@"Key1"];

虽然有更好的方法可以完成这项工作。