gpt4 book ai didi

ios - NSCache 没有在第一次被询问时返回数据

转载 作者:行者123 更新时间:2023-11-29 12:37:32 25 4
gpt4 key购买 nike

对于我的应用程序,我必须将一些 HTML 转换为 tableViews 中的 NSAttributedStrings。这是一个 CPU 密集型操作,所以我决定利用 NSCache 有效地将时间减半,因为 HTML 被转换了两次,一次是测量单元格的大小,另一次是绘制单元格。

问题是第一次查询缓存中的对象时,它返回 nil,就好像它从未被发送到缓存中一样。

两个请求都是在同一个队列(主队列)上进行的,我已经验证了缓存键是相同的,并且正在使用的缓存是相同的。我做错了什么?

这是我的代码:

#import "HITProduct+Cache.h"

@implementation HITProduct (Cache)

static NSCache *cache;

- (NSAttributedString *)attributedString
{
@synchronized(cache) {
if (!cache) {
cache = [NSCache new];
cache.evictsObjectsWithDiscardedContent = NO;
cache.countLimit = 10;
}
}

NSMutableAttributedString *attributedString;
@synchronized(cache) {
attributedString = [cache objectForKey:self.title];
}

if (!attributedString) {
attributedString = [[[NSAttributedString alloc] initWithData:[self.title dataUsingEncoding:self.title.fastestEncoding] options:@{NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType} documentAttributes:nil error:nil] mutableCopy]; //This is very slow

@synchronized(cache) {
[cache setObject:attributedString forKey:self.title];
}
}

return [attributedString copy];
}

@end

最佳答案

你能试试这个代码吗(没有@synchronized和启用ARC):

- (NSAttributedString *)attributedString {
if(self.title == nil){ return nil; }

static NSCache *cache = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
cache = [NSCache new];
cache.evictsObjectsWithDiscardedContent = NO;
cache.countLimit = 10;
});


NSAttributedString *attributedString = [cache objectForKey:self.title];
if (!attributedString) {
attributedString = [[NSAttributedString alloc] initWithData:[self.title dataUsingEncoding:self.title.fastestEncoding]
options:@{NSDocumentTypeDocumentAttribute : NSHTMLTextDocumentType}
documentAttributes:nil error:nil];

[cache setObject:attributedString forKey:self.title];
}

return attributedString;
}

关于ios - NSCache 没有在第一次被询问时返回数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25890642/

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