在我的AppDelegate中,我从互联网上下载了一些数据并将其存储到一个数组中。我希望我的一个ViewControllers访问该数组。我该怎么做呢?这是实现委托或协议的好情况吗?如果是这样,有人可以为此推荐一个好的教程吗?
谢谢
编辑:
请注意,每次发布时数据都会刷新,因此不需要Core Data或plists。此外,数据是我创建的自定义对象,因此它们不能存储在plist中。
答案 0 :(得分:3)
您有两个选择:
在这个问题和答案中,各自的优点/缺点都很好: Delegates v Notifications
由于通知更容易实现并且可能足以满足您的需求,您可以通过以下步骤实现:
NSDictionary *dict = [NSDictionary dictionaryWithObject:array forKey:@"Data"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"DataDownloaded" object:self userInfo:dict];
2.1将以下行添加到viewDidLoad方法:
`[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataDownloaded:) name:@"DataDownloaded" object:nil];
2.2创建dataDownloaded选择器:
(void)dataDownloaded:(NSNotification *)note {
NSDictionary *dict = note.userInfo;
NSArray *dataArray = [note.userInfo objectForKey:@"DataDownloaded"];
2.3将以下行添加到dealloc和viewDidUnload:
[[[NSNotificationCenter defaultCenter] removeObserver:self];
答案 1 :(得分:0)
您可以将数据存储在plist文件中,并在所有视图控制器中使用它。这样,您无需担心数据的大小(因为您将按需加载并立即释放它)。
答案 2 :(得分:0)
如果要将数组存储在委托中,则在任何视图中都必须创建委托的引用,并且可以在该视图中访问数组,如:
在你的其他视图中你必须写:.h文件
#import "YourDelegateFile.h"
并声明变量
YourDelegateFile *appDelegate ;
你的.m文件中的:
- (void) viewDidLoad
{
appDelegate = (YourDelegateFile *)[UIApplication sharedApplication] delegate];
NSArray *aArray = [appDelegate yourArrayName]; //yourArrayName is an array that you have declare in delegate
}
希望它可以帮到你。
答案 3 :(得分:0)
您只需访问appdelegate中存储的数据即可。我不认为这是解决问题的最佳方法,但是为了按照你想要的方式做事。
所以在Appdelegate .h文件中声明你的属性
NSMutableArray* myArray_;
然后将属性添加到同一文件
@property (nonatomic, retain) NSMutableArray* myArray;
<。>文件中的
确保合成你的财产
@synthesize myArray = myArray_;
在appdelegate .m文件中的某个位置,您将设置值
然后,在您的代码中的其他位置,您可以像在这样的
MyAppDelegate *appDelegate = (MyAppDelegate *)[UIApplication sharedApplication].delegate
NSMutableArray* localArray = appDelegate.myArray;
注意,为了获得良好的封装,你应该使用NSArray但我使用mutable来保持代码简短。
此外,使用appdelegate作为程序数据的全局存储并不是一个好主意,它打破了许多你不应该破坏的规则,单一责任原则是一个很好的开始。理想情况下,您应该将应用程序数据存储在专用类中,可能是单例,也可以是工厂类服务的单个实例类的更好的可测试性。通过这种方式,您可以从已知的明确定义的实体访问数据,它是可测试的并且它符合良好的设计原则
答案 4 :(得分:0)
如果app delegate获得了新数据,并且所有感兴趣的控制器都知道他们需要更新视图,您可以发送通知。为此,您可以使用NSNotificationCenter
。例如
- (void)newDataLoaded {
NSDictionary *userInfo = [NSDictionary dictionaryWithObject:arrayOfData forKey:@"data"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"data updated notification name" object:nil userInfo:userInfo];
}
如果某个控制器对数据更新感兴趣,它应该尽快订阅此通知:
- (void)viewDidLoad {
...
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dataUpdatedNotificationHandler:) name:@"data updated notification name" object:nil];
...
}
如果您不需要,请不要忘记取消订阅通知。为此,[[NSNotificationCenter defautCenter] removeObserver:self]
和viewDidUnload
方法使用dealloc
。
- (void)dataUpdatedNotificationHandler:(NSNotification*)notification {
NSArray *data = [[notification userInfo] objectForKey:@"data"];
// update your view here
}