Kyl*_*egg 7 iphone model-view-controller delegates objective-c ios
我找到了几个解释如何使用AppDelegate在iOS应用程序中的对象之间共享数据的来源.我已经非常轻松地实现了它,在我的情况下它看起来是一个很好的方法.什么思考可以使用的AppDelegate做,我想知道行应绘制.
显然,还有其他方法可以跨视图控制器共享数据,使用Singleton对象和NSUserDefaults.什么时候使用AppDelegate共享数据?在我目前的情况下,我使用这种方法来存储用于推送通知的appleDeviceToken.当用户登录或注销应用程序时,我会使用该令牌.
在MyAppDelegate.h中,我声明了属性:
@property (nonatomic, retain) NSString *appleDeviceToken;
Run Code Online (Sandbox Code Playgroud)
在MyAppDelegate.m中,我合成了appleDeviceToken,然后设置它:
@synthesize appleDeviceToken;
------------------------------------------------------
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
NSString *devToken = [[[[deviceToken description]
stringByReplacingOccurrencesOfString:@"<"withString:@""]
stringByReplacingOccurrencesOfString:@">" withString:@""]
stringByReplacingOccurrencesOfString: @" " withString: @""];
appleDeviceToken = devToken;
}
Run Code Online (Sandbox Code Playgroud)
然后,在我的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];
Run Code Online (Sandbox Code Playgroud)
到目前为止这种方法很有效,但这是理想的方法吗?我还应该知道什么?
当数据和对象真正全局和/或无法在图表中向下推进时.通常不需要在此高水平存储.同样,您的实现通常应该对应用程序委托知之甚少 - 什么比单身人士更糟糕?God-Singleton :)如果应用代表很复杂,那就出问题了.如果应用程序委托的界面#import对您的许多实现可见(通过)或者直接向它们发送消息,那么就会出现问题.
不需要(惯用的ObjC)单例 - 应用程序委托的一个实例.
NSUserDefaults用于持久化小值(顾名思义) - 共享的能力是副作用.
由于在这种情况下UIKit已将数据发送到app委托,因此这可能是存储数据或对象表示的好地方.您还可以考虑将这些消息转发到适当的处理程序.重要的一点 - 在大多数情况下,您希望初始化流向对象图,并从最低点流出(例如,与引用应用委托的许多对象相反).因此,您可能会看到应用程序委托设置了顶级视图控制器的模型,但视图控制器可以设置它推动的视图控制器的模型.通过这种方式,您将减少依赖关系和控制流,更容易跟踪因果关系,并且您将能够更轻松地进行测试 - 无需大规模全局状态的上下文.
以下行总是表明您做错了什么:
MyAppDelegate *appDelegate = (MyAppDelegate*) [UIApplication sharedApplication].delegate;
Run Code Online (Sandbox Code Playgroud)
应用程序委托是该委托的代表UIApplication.它被称为有原因.它不被称为ApplicationDataStore甚至是ApplicationCoordinator.事实上,你正在向应用程序询问它delegate,然后将其视为除了id<UIApplicationDelegate>意味着你已经要求它做一些事情,而不是做任务.它的任务是管理事物的UIApplication需求(这并不意味着"应用程序"需要的一切).
您似乎已经建立了一个存储此信息的地方:RKObjectManager.我会让应用程序委托在那里传递令牌,我会让登录视图控制器注意到它是时候推送它了.我甚至不把字符串@"/api/users/%i/appleDeviceToken"放在视图控制器中.这与显示视图无关.这对你的网络堆栈(你似乎已经安置RKObjectManager)."ViewController"表示"用于帮助显示视图的控制器"而不是"视图表示的操作的处理器".
| 归档时间: |
|
| 查看次数: |
4766 次 |
| 最近记录: |