使用NSURLConnection执行sendSynchronousRequest时显示加载屏幕

时间:2011-08-11 17:23:25

标签: iphone ios

按下按钮时,我需要登录。当调用sendSynchronousRequest时,我想要一个“加载”指示符。我知道在我发出URL请求之前添加加载屏幕是行不通的,因为直到URL请求返回结果后才显示代码。我尝试了几件事:

  • 使用通知中心:添加观察者并发送消息,然后启动加载屏幕。在选择器中执行实际请求(删除了加载视图)。这似乎不起作用。
  • 为URL请求创建一个单独的线程(给我一个关于在非web /非主线程中使用web块的奇怪错误
  • 为加载视图创建一个单独的线程(没有显示任何内容!)

我想得到两个答案:1)什么是快速和脏(但功能,使用iOS 3.2+)的方式来做到这一点? 2)什么是正确的方法呢? :)

由于

2 个答案:

答案 0 :(得分:1)

快速而肮脏的方式:

- (void)startLogin:(id)sender {
    NSURLRequest *request = ...;
    [activityIndicator startAnimating]; // or whatever you need to get your loading screen to show
    [self performSelector:@selector(startRequest:) withObject:request afterDelay:0.0];
}

- (void)startRequest:(NSURLRequest *)request {
    //Do your actual request here...
}

好一点:在后台线程上做请求(忘记在后台线程上做动画,UIKit不是线程安全的)

好多了:使用主线程中NSURLConnection的异步方法。这样,您不会阻止(如果您愿意,可以使用“屏蔽”视图阻止UI),如果需要很长时间(您永远不知道您的用户属于哪种类型的网络),您可以取消请求不必担心线程安全。

答案 1 :(得分:0)

如果你想同步这样做,你需要在主线程之外的另一个线程中执行它,如果你想在UI同时发生某些事情的话。请求完成后,您需要调用主线程来删除加载指示器,因为UI操作只允许在主线程中。

1)由于您已经创建了创建线程等的代码,因此最快的方法是在新方法中添加请求之后的内容并使用performSelectorOnMainThread:withObject:waitUntilDone:

调用该方法

2)您可以使用异步请求。但我不会说这是一种更恰当的方式。但是在这种情况下你不需要乱用线程。在iOS4 +中,您可以使用Grand Central Dispatch,dispatch_async等,这比手动创建线程更容易。