根据 MVC 来看这个,你有两个部分:
- 一个数组——这是模型
- 从服务器获取库存的代码——这是控制器
这个控制器代码实际上是模型控制器,而不是视图控制器。我不会把它放在视图控制器类中。如果代码非常简单,您可以将它放在您的应用程序委托中,但我建议将它完全放在它自己的类中。
在-applicationDidFinishLaunching中:
[[InventoryController sharedInstance] reloadContent];
[[InventoryController sharedInstance] scheduleUpdates];
库存控制器.h
@interface InventoryController
@property (retain) NSArray *inventory;
@property (retain) NSTimer *reloadTimer;
+ (InventoryController *) sharedInstance;
- (void) reloadContent;
- (void) scheduleUpdates;
@end
库存控制器.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
检查日期的方法,然后首先调用它。
请记住在后台加载 URL。您不应该在处理事件或操作时停止并重新加载数据,因此本质上,您的视图控制器需要在等待数据时从操作方法返回,并在您获取数据时调整其显示。
如果视图控制器需要在数据刷新后做出响应,让视图控制器注册一个通知,您可以在库存控制器完成更新其内容时发布该通知:
[[NSNotificationCenter defaultCenter]
postNotificationName:InventoryControllerDidReloadContent
object:self];
如果您想在设备上缓存库存数据,以便在应用程序进入后台时将其从内存中删除,您可以通过将数组写入属性列表来实现,但如果陈旧数据没有用处,您可能不会想打扰。
您可以使用 Core Data 代替数组和属性列表,但它不会消除对从服务器加载数据并将其加载到上下文中的控制器的需要。您可能会有一个托管对象上下文和一个获取的结果控制器,而不是一个数组。如果您不在应用程序中编辑该内容,我怀疑 Core Data 是否会比数组和属性列表提供任何好处。