在类之间传递对象

时间:2011-08-07 19:07:06

标签: iphone objective-c ios cocoa-touch ipad

在我的AppDelegate中,我从互联网上下载了一些数据并将其存储到一个数组中。我希望我的一个ViewControllers访问该数组。我该怎么做呢?这是实现委托或协议的好情况吗?如果是这样,有人可以为此推荐一个好的教程吗?

谢谢

编辑:

请注意,每次发布时数据都会刷新,因此不需要Core Data或plists。此外,数据是我创建的自定义对象,因此它们不能存储在plist中。

5 个答案:

答案 0 :(得分:3)

您有两个选择:

  1. 实施委托协议
  2. 使用NSNotifications
  3. 在这个问题和答案中,各自的优点/缺点都很好: Delegates v Notifications

    由于通知更容易实现并且可能足以满足您的需求,您可以通过以下步骤实现:

    1. 在您下载数据的类中: 下载数据并填充阵列后,请包含以下行:
    2. NSDictionary *dict = [NSDictionary dictionaryWithObject:array forKey:@"Data"]; [[NSNotificationCenter defaultCenter] postNotificationName:@"DataDownloaded" object:self userInfo:dict];

      1. 在您要接收数据的班级中:
      2. 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文件中的某个位置,您将设置值

然后,在您的代码中的其他位置,您可以像在这样的中访问appdelegate中的属性

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
}