我正在尝试在第一次打开应用时添加用户。用某种密码添加回复给我,我们称之为Access Token。令牌用于访问API服务。
无论如何,除了这个故事,我的问题是第一次打开应用程序,我可以添加用户并获取令牌,我将其保存为NSUserDefault,但我无法访问API服务,因为它试图达到null的服务。刷新或重新打开应用程序或切换另一个视图并返回该视图将解决问题。但这是第一次,它无法达到服务。
问题在于,显然,当应用程序第一次打开时,在添加操作完成之前,我尝试达到服务的原因,使其保持为空。所以这是我的代码:
- (void)viewDidLoad {
[super viewDidLoad];
//Adding user.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // User informations.
NSString *accessToken = [defaults objectForKey:@"accessToken"];
if(accessToken == nil)
[APIClient AddUser];
//Adding the inital viewController.
UIViewController *vc = [self viewControllerForSegmentIndex:self.typeSegmentedControl.selectedSegmentIndex];
[self addChildViewController:vc];
vc.view.frame = self.contentView.bounds;
[self.contentView addSubview:vc.view];
self.currentViewController = vc;
}
在添加初始viewController时,不要挂断我正在做的事情,而不是那样只是看看当我添加用户然后初始化viewController时会发生什么。 异步是问题,所以我正在寻找在应用程序实际启动或启动之前添加用户的方法。
我不确定在这种情况下我是否必须在application:didFinishLauncingWithOptions
中添加用户,但我不认为这是问题所在。
答案 0 :(得分:1)
好的,我要做的第一件事就是将令牌相关代码提取到视图控制器中的函数。我们称之为tokenReceived:
-(void) tokenReceived{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // User informations.
NSString *accessToken = [defaults objectForKey:@"accessToken"];
if(accessToken == nil)
[APIClient AddUser];
//Adding the inital viewController.
UIViewController *vc = [self viewControllerForSegmentIndex:self.typeSegmentedControl.selectedSegmentIndex];
[self addChildViewController:vc];
vc.view.frame = self.contentView.bounds;
[self.contentView addSubview:vc.view];
self.currentViewController = vc;
}
在视图中加载了以下内容:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(onGetToken)
name:@"getToken"
object:nil];
然后添加新方法:
- (void) onGetToken
{
[self tokenReceived]
}
并且,当然,当您获得令牌(在app委托中或在您检索令牌的任何地方)时,向观察者发送通知:
// your code, saving to nsuserdefualts etc.
[[NSNotificationCenter defaultCenter]
postNotificationName:@"getToken"
object:self];
说明:使用网络阻止主线程是一种不好的做法 - 你的应用程序不会响应任何事件,如果你没有3g或wifi,你就会被卡住。用户体验不好,这将驱使用户离开。
另一方面,这将打开用户界面,你可以根据需要放置加载器,直到你通知视图控制器你实际上有东西。这样,您将保持网络的异步性,并在获得网络时仍然刷新UI。如果您担心在打开视图控制器之前会获得令牌,则可以添加tokenReceived
以查看确实加载。
还有一件事,您可以使用该对象发送NSNotification,并从NSNotification对象获取一个,但在这种情况下,您只需要通知发生了某些事情,您不需要该数据。