只下载一次数据,然后可以在整个应用程序中访问; NSUserDefaults 与单例

Posted

技术标签:

【中文标题】只下载一次数据,然后可以在整个应用程序中访问; NSUserDefaults 与单例【英文标题】:Downloading data only once and is then accessible throughout the app ; NSUserDefaults vs Singleton 【发布时间】:2014-06-13 11:51:52 【问题描述】:

我必须在应用程序启动时仅从 Web 服务下载一系列内容。然后需要在以后的阶段通过整个应用程序访问这些数据。我每次启动都需要下载它的原因是内容可以随时更改。

我正在考虑将这个数组存储在 NSUserDefaults 中,因为无论如何它都可以访问。但我也考虑过创建一个单例类。据我了解,NSUserDefaults 本身就是一个单例。

在为我的案例创建单例类时使用 NSUserDefaults 是不好的做法吗?

【问题讨论】:

如果您有更复杂的数据,那么 NSUserDefaults 将无法正常工作,并且您的应用程序会更重。使用全局数组存储数据或使用单例..... 不,使用全局数组或单例将无法达到目的,因为一旦应用程序终止,它们将丢失所有内容。如果在使用 NSUserDefaults 时出现问题(极不可能),请使用 Sqlite 来存储内容。 NSUserDefaults 可以很容易地达到目的。 【参考方案1】:

使用NSUserDefaults 存储此数据的问题在于,它的值在应用程序的多次调用中仍然存在。但是,您的应用会在启动时立即将之前存储的数据替换为来自服务器的任何数据,因此之前加载的数据成为设备存储的无用负担。

当然,将数据存储在NSUserDefaults 中的一大优点是,当没有连接时,您的应用程序可以拥有一些数据。如果在可能过时的数据上运行比根本不运行要好,NSUserDefaults 是一个有效的选择。

如果您只需要在应用运行期间保留数据,则使用单例是更理想的解决方案。

【讨论】:

【参考方案2】:

NSUSerDefaults 会更好,因为它们有点像持久化数据库,因为它们在应用程序终止后不会丢失内容,而单例则没有这种能力。

一个建议,如果您可以更改接收到的 XML 的结构或您的团队正在处理 XML 创建部分,如果您要求他们添加一个标签,例如“version = 1.0”,那将非常方便。每次打开应用程序时,下载数据,只需检查版本是否已更改,如果更改则更新您的 NSUserDefault 内容,否则使用旧内容。只需添加一个标签来检查 XML 的版本就可以省去很多麻烦。

【讨论】:

【参考方案3】:

我不确定NSUserDefaults 是否真的用单例模式实现。 [NSUserDefaults standardUserDefaults] 也许是。

使用NSUserDefaults 的优点是您可以将下载的数据存储在用户设备中以备后用,特别是在其他时间启动您的应用时设备未连接到互联网的情况下。

如果您通过此数据初始化的对象的构建需要考虑一段时间,我建议您同时使用 NSUserDefaults 存储离线数据和 Singleton 以确保所有内容都将在您的应用启动时构建.

还要注意NSUserDefaults 只能存储NSDataNSStringNSNumberNSDateNSArrayNSDictionary。如果您的数据不是这些类型,我建议您在用户设备中保存一个文件。

单例实现:

@implementation Singleton

-(id)init
    self = [super init];
    if(self)
        //initialization
    
    return self;



+(id)allocWithZone:(struct _NSZone *)zone
    return [self init];


+(Singleton *)sharedInstance
    static Singleton *instance=nil;
    if(!instance)
        instance = [[super allocWithZone:nil] init];
    
    return instance;

我还建议您使用AFNetworking 进行 WebService 调用。它处理线程和东西,以便用户不必等到调用完成才能打开您的应用程序。虽然尚未完成,但请使用之前下载的数据打开应用。

希望对你有帮助!

【讨论】:

感谢您的评论,我是NSURLSession 而不是AFNetworkingNSURLConnection. 这是苹果自己的方法,它实现了许多与AFNetworking 相同的方法 @Gman 谢谢!我不知道这些课程..我要检查它是如何工作的!我知道还有UNIRest,但我不认为它比其中任何一个都好......

以上是关于只下载一次数据,然后可以在整个应用程序中访问; NSUserDefaults 与单例的主要内容,如果未能解决你的问题,请参考以下文章

# yyds干货盘点 # 手把手教你抖音系列视频批量下载器开发

如何下载整个网站的图片(只能通过网址访问,无超链接)

只进行一次迁移

单例模式

第一次启动应用程序时如何只访问一次任何方法

iOS – 单例模式写一次就够了