1

我正在 iOS 应用程序中实现一些 RESTful API,目前正在开发登录功能。用户输入用户名和密码,当按下登录时会发生以下情况:

网络活动指示器变为可见,文本标签变为隐藏(以及登录按钮),活动指示器变为可见并且带有文本“登录”的标签。然后:

    dispatch_async(queue, 
    ^{[self performSelectorOnMainThread:@selector(performAuthCall) 
    withObject:nil waitUntilDone:YES];});

在 performAuthCall 方法中,视图控制器的属性(布尔值)设置为 YES 或 NO,取决于登录是否成功(我使用 NSURLConnection 的 sendSynchronousRequest)。如果是,则显示另一个视图控制器。如果不是,则会显示警报。我并没有真正得到我想要的结果,控制器在执行请求之前正在测试成功的登录布尔值,我尝试了不同的方法,但我无法让它正常工作并且不冻结 UI。所以,我的问题是:

我怎样才能首先使所有隐藏/显示的东西(比如使活动指示器和“登录”标签可见),然后开始授权过程,等到它完成,然后才转到另一个视图控制器或显示警报或东西?

4

2 回答 2

1

NSURLConnection sendAsynchronousRequest:::改为使用

[NSURLConnection sendAsynchronousRequest:request
                                queue:[NSOperationQueue currentQueue]
                    completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    NSLog(@"response = %@", response);
    //do the UI update/segue here once completed.
}];

这样您就不会在 url 加载期间阻塞主线程。

于 2013-04-10T14:47:39.527 回答
0

为了建立 Mike 关于使用背景的答案并获得我认为您正在寻找的功能,请执行以下操作。

绑定您在单击登录按钮上的操作以激活方法。这仍将处于前台。立即将您的应用程序逻辑调度到后台以处理消息。如果您愿意,您的后台方法 (performAuthCall) 仍然可以运行同步。

dispatch_async(dispatch_get_global_queue(0, 0),
                       ^ {
                           [self performAuthCall];
                       });

此外,在您发送的相同方法中,将您的 bool 设置为阻止呼叫,将您的按钮变灰,启动您的活动控制。主线程仍然可以运行和工作,但是您拦截诸如 shouldPerformSegueWithIdentifier 之类的项目将允许您阻止不需要的导航。

当您的 performAuthCall 完成后,让它在主线程上执行一个选择器以设置布尔值,以便方法可以开始移动、取消灰色项目、停止活动控制。它还确定您是启动警报(密码错误)还是强制 segue 进入您的下一个控制器。

请记住 - UI 需要在主线程中的所有内容和所有额外的逻辑(例如执行登录调用之类的操作)都应该在后台线程中。

于 2013-04-10T17:23:23.193 回答