使用AppDelegate中共享数据(Using the AppDelegate to share

2019-06-27 04:50发布

我发现一对夫妇解释如何使用AppDelegate中的iOS应用程序共享对象之间的数据源。 我很怕疼实现它,它看起来像我的情况一个很好的方法。 什么可以使用AppDelegate中完成,我想知道行应绘制的思考。

显然,还有其他的方式来分享跨视图控制器的数据 ,使用单一对象 ,和NSUserDefaults的 。 什么时候适合使用AppDelegate中共享数据? 在我目前的状况,我用这种方式来存储用于推送通知的appleDeviceToken。 我使用的令牌当用户登录或应用程序的注销。


在MyAppDelegate.h我财产申报:

@property (nonatomic, retain) NSString *appleDeviceToken;

在MyAppDelegate.m我合成appleDeviceToken然后将其设置:

@synthesize appleDeviceToken;    

------------------------------------------------------

- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
  NSString *devToken = [[[[deviceToken description]
                          stringByReplacingOccurrencesOfString:@"<"withString:@""]
                         stringByReplacingOccurrencesOfString:@">" withString:@""]
                        stringByReplacingOccurrencesOfString: @" " withString: @""];
  appleDeviceToken = devToken;
}

然后,在我的LoginViewController.m我找回它,并将其发布到我的服务器:

  NSString *urlForDeviceTokenPost = [NSString stringWithFormat: @"/api/users/%i/appleDeviceToken", userId];

  MyAppDelegate *appDelegate = (MyAppDelegate*) [UIApplication sharedApplication].delegate;
  NSString *appleDeviceTokenStr = appDelegate.appleDeviceToken;

  AppleDeviceToken *appleDeviceToken = [[AppleDeviceToken alloc] init];
  appleDeviceToken.deviceToken = appleDeviceTokenStr;

  [[RKObjectManager sharedManager] postObject:appleDeviceToken delegate:self];

这个伟大的工程,到目前为止,但这是理想的方法? 还有什么我应该知道吗?

Answer 1:

当数据和对象是真正的全球性和/或不能倒图形进一步推。 存储在这个高层次通常不需要。 同时,您的实现应该平时几乎没有任何有关应用程序的委托知识 - 什么比单身更糟糕? 神 - 辛格尔顿:)如果应用程序委托是复杂的,有什么地方出了问题。 如果应用程序委托的接口是可见的(通过#import )到您的许多实现的或他们的消息直接,那么什么是错的。

有没有必要为一个(惯用ObjC)单 - 有应用程序委托的一个实例。

NSUserDefaults的为小的值的持久性(顾名思义) - 共享的能力的副作用。

因为在这种情况下,数据已被送入应用程序委托由UIKit中,这可能是一个很好的地方来存储数据,或的对象表示。 你也可以考虑那些转发消息给合适的处理器。 最重要的一点 - 在大多数情况下,你会想初始化流下来的对象图,并从最低点可能流动(例如相对于许多对象指回应用程序代理)。 所以,你可能会看到应用程序的委托设置一个最高级别视图控制器的模型,但随后的视图控制器可以将它推视图控制器的型号。 这样,您将减少依赖和控制流,因果会更容易跟踪,你将能够更容易地测试 - 无大规模全局状态的背景下。



Answer 2:

下面的线总是表示你做错了什么:

MyAppDelegate *appDelegate = (MyAppDelegate*) [UIApplication sharedApplication].delegate;

该应用程序委托是的代表UIApplication 。 它被称为是有原因的。 这不叫ApplicationDataStore甚至ApplicationCoordinator 。 你问其申请的事实delegate ,然后将其视作比其他东西id<UIApplicationDelegate>意味着你要求它做一些它不能与做任务。 它的任务是管理的事情UIApplication需要(这并不意味着“所有的‘应用程序’需要)。

看来,已经构建存储这些信息的地方: RKObjectManager 。 我会在应用程序代理通过令牌那里,我必须登录视图控制器只需要注意,现在是时候推它。 我甚至不会把字符串@"/api/users/%i/appleDeviceToken"在视图控制器。 这是不相关的显示视图。 这是东西给你网络堆栈(你似乎在安置了RKObjectManager )。 “视图控制器”是指“控制器,用于帮助显示视图”非“操作的处理器,所述视图表示”。



Answer 3:

这似乎是一个合适的使用。 该应用程序委托是很有诱惑力的误用,因为它是一个易于访问的对象是已经存在于每一个应用程序。 它具有真正的目的,虽然,这是,正如其名称所示,使决策为应用对象,就像表视图委托确实为它的表视图对象。

在这种情况下,你存储传递给应用程序本身的委托信息。 我说这就是绘制直线。

保存此令牌似乎是按照应用程序委托的目的,除非你不得不将其在处理远程通知集中另一个控制器对象。 在这种情况下,你可能只是传递令牌权到该控制器。



Answer 4:

我更务实。 因为在我的应用程序中的appDelegate知道tabBarController如何填充,所有的导航控制器,我有几种方法那里,让一些任意类与其他类通讯 - 通常这些都是一些类的单个实例(但不是单身)。 这就是说,如果你想放在那里没有一个令人信服的理由是在什么样的appDelegate,那么,它可能不属于那里!



文章来源: Using the AppDelegate to share data