iphone – iOS瓶颈:全局变量与核心数据或Properity列表

我是iOS&的新手可可.我的问题不是关于如何使某些东西发挥作用,而是关于改进用户体验的设计.性能.

我正在为现有应用添加功能.目前,该应用程序有一个类“RootViewController”(RVC),负责发出服务器请求. RVC调用服务器以获取json响应.解析此json响应,并且解析的响应由名为“array”的NSArray对象引用.服务器为“阵列”提供的数据必须定期更新,因为它代表其他客户可以购买的实时库存.

我需要在应用程序的生命周期中的不同时间使用其他类中的“数组”引用.每次我想使用或更新“数组”时我都不想调用服务器.在我自己的设备上测试这个应用程序时,似乎调用服务器可能很慢 – >伤害应用程序的性能.

我考虑过创建一个可以充当委托的类来保持对NSArray的引用 – 有点像全局变量.我向服务器发出一个异步请求,并跟上这个委托类中的响应.我不确定如何确定这种方法是否有效或考虑最佳实践(考虑到MVC).

我正在寻找存储“数组”的最佳位置,以便其他类可以快速使用它而不必过多地依赖网络或内存使用. “array”必须能够偶尔从服务器更新(因为“模型”可能会从库存变化中更改).根据我的研究,iOS的CoreData似乎是最好的起点,但我不知道如果应用程序不活跃,如何定期更新CoreData.换句话说,如果最近没有更新CoreData中的数据,我不想向用户显示陈旧数据.

json响应大约是20KB-45KB.

存放轻量物体的最佳/备用位置在哪里,以便定期更新?我倾向于会话样式变量,但我不知道是否有更好的方法来做到这一点.

最佳答案 根据MVC来看这个,你有两个部分:

>一个数组 – 这是模型
>从服务器获取库存的代码 – 这是控制器

这个控制器代码实际上是模型控制器,而不是视图控制器.我不会把它放在视图控制器类中.如果代码非常简单,你可以把它放在你的app委托中,但我建议把它完全放在自己的类中.

In -applicationDidFinishLaunching:

[[InventoryController sharedInstance] reloadContent];
[[InventoryController sharedInstance] scheduleUpdates];

InventoryController.h

@interface InventoryController

@property (retain) NSArray *inventory;
@property (retain) NSTimer *reloadTimer;

+ (InventoryController *) sharedInstance;
- (void) reloadContent;
- (void) scheduleUpdates;

@end

InventoryController.m

@implmentation InventoryController

- (void) reloadContent {
    ...
}

+ (InventoryController *) sharedInstance {
    static InventoryController * singleton;
    if (!singleton)
        singleton = [[self.class alloc] init];
    return singleton;
}

- (void) scheduleUpdates {
    self.reloadTimer = ...;
}

@end

其他地方:

NSArray *inventory = [[InventoryController sharedInstance] inventory];

在-reloadContent中,您应该从服务器中提取内容.在-scheduleUpdates中,您应该设置一个作用于控制器的计时器,使其定期重新加载数据.如果视图控制器需要在数据过时时调整其行为,请将NSDate与数组一起存储,添加一个像-isStale这样的方法来检查日期,然后再调用它.

请记住在后台加载网址.在处理事件或操作时,不应该停止并重新加载数据,因此实质上,视图控制器需要在等待数据时从操作方法返回,并在获取数据时调整其显示.

如果视图控制器在刷新数据后需要响应,请让视图控制器注册一个通知,您可以在库存控制器完成更新其内容时发布该通知:

    [[NSNotificationCenter defaultCenter]
    postNotificationName:InventoryControllerDidReloadContent
                  object:self];

如果您想在设备上缓存库存数据,以便在应用程序进入后台时将其从内存中删除,您可以通过将数组写入属性列表来实现,但如果陈旧数据无效,则可能不会想要打扰.

您可以使用Core Data代替数组和属性列表,但它不会消除对从服务器加载数据并将其加载到上下文中的控制器的需要.您可能拥有托管对象上下文和获取结果控制器,而不是拥有数组.如果您没有在应用程序中编辑该内容,我怀疑Core Data将在阵列和属性列表中提供任何好处.

点赞