iphone – 使用NSUserDefaults作为全局实例变量的一个坏主意?

iphone – 使用NSUserDefaults作为全局实例变量的一个坏主意?,第1张

概述我有一个应用程序,当加载主主屏幕时,我检查后台的同步更新.如果连接速度较慢或用户快速浏览应用程序,则会在后台堆叠这些请求.为了防止这种情况,我想实现一个BOOL变量,我切换YES或NO以防止多个请求出去检查同步. 所以我的代码在启动请求时会是这样的: NSUserDefaults *d = [NSUserDefaults standardUserDefaults]; NSString *key 我有一个应用程序,当加载主主屏幕时,我检查后台的同步更新.如果连接速度较慢或用户快速浏览应用程序,则会在后台堆叠这些请求.为了防止这种情况,我想实现一个BOol变量,我切换YES或NO以防止多个请求出去检查同步.

所以我的代码在启动请求时会是这样的:

NSUserDefaults *d = [NSUserDefaults standardUserDefaults]; Nsstring *key = [Nsstring stringWithFormat:kVarallowSyncRequest,aManufacturerID]; [d setBool:NO forKey:key];

我知道这会有效,但在我的应用程序使用过程中会被称为100次 – 这是我甚至需要担心的事情吗?

有没有更好的方法来做到这一点?

解决方法 用户默认值是一个放置偏好和信息的好地方,每个会话不会更改或需要访问两到三次.访问默认值意味着命中磁盘,这很慢;你不想把它用于像一分钟多次检查旗帜那样的东西.

应用程序委托是一个方便的地方,用于存储应用程序中许多对象真正需要访问的信息,因为它始终可以通过[[UIApplication sharedApplication]委托]访问,但在称重该对象之前,您应该仔细考虑您的应用程序设计因为看起来很方便,所以需要很多伊娃.

据推测,只有一个对象,可能是视图控制器,负责发送这些请求.这是举旗的地方.根据您的描述,听起来您根本不需要app-global变量.该标志仅由发起请求的对象使用,因此它是唯一需要了解它的对象.国旗可以是伊瓦尔.

实际上,如果你有一个类,它可能有许多实例,每个实例都会发出一个请求,那么正确的解决方案就是拥有一个任何实例都可以访问的类级别标志.这很简单.在您的实现文件中,声明一个变量来保存标志:

// RequestMaker.m#import "RequestMaker.h"static BOol allowSyncRequest = YES;@implementation RequestMaker// etc.

它被声明为静态,使其仅在此“编译单元”中可见(松散地,在此文件中).

然后你创建一个类方法来设置并获得这个标志:

+ (BOol) allowSyncRequest {    return allowSyncRequest;}+ (voID) setAllowSyncRequest: (BOol)b {    allowSyncRequest = b;}

现在,每当您的一个RequestMaker实例想要启动请求时,它应该检查该标志;如果是,则可以关闭标志并开始请求.您还需要确保在请求完成时重置标志.

(这一切都假设你没有明确地为你的请求工作不同的线程.如果你是,那么你应该研究GCD queues和信号量.有一套优秀的writeups by Mike Ash即使你不想使用它也会很有趣GCD).

总结

以上是内存溢出为你收集整理的iphone – 使用NSUserDefaults作为全局实例变量的一个坏主意?全部内容,希望文章能够帮你解决iphone – 使用NSUserDefaults作为全局实例变量的一个坏主意?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1080302.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存