Iphone 使用NSURLConnection执行sendSynchronousRequest时显示加载屏幕
当按下按钮时,我需要登录。调用sendSynchronousRequest时,我希望有一个“加载”指示器。我知道在我发出URL请求之前添加加载屏幕是不起作用的,因为直到URL请求返回结果后才到达显示代码。我尝试了几件事:Iphone 使用NSURLConnection执行sendSynchronousRequest时显示加载屏幕,iphone,ios,Iphone,Ios,当按下按钮时,我需要登录。调用sendSynchronousRequest时,我希望有一个“加载”指示器。我知道在我发出URL请求之前添加加载屏幕是不起作用的,因为直到URL请求返回结果后才到达显示代码。我尝试了几件事: 使用通知中心:添加观察者并发送消息,然后启动加载屏幕。在选择器中执行实际请求(删除加载视图)。这似乎不起作用 为URL请求创建一个单独的线程(在非web/非主线程中使用web块时给了我一个奇怪的错误) 为加载视图创建一个单独的线程(没有显示任何内容!) 我想得到两个答案:1
- 使用通知中心:添加观察者并发送消息,然后启动加载屏幕。在选择器中执行实际请求(删除加载视图)。这似乎不起作用
- 为URL请求创建一个单独的线程(在非web/非主线程中使用web块时给了我一个奇怪的错误)
- 为加载视图创建一个单独的线程(没有显示任何内容!)
谢谢如果你想同步完成,你需要在主线程之外的另一个线程中完成,如果你想让UI同时发生一些事情的话。请求完成后,您需要调用主线程以删除加载指示器,因为UI操作只允许在主线程中进行 1) 由于您已经创建了用于创建线程等的代码,最快的方法可能是将请求后的内容添加到新方法中,并使用
performSelectorOnMainThread:withObject:waitUntilDone:
2) 您可以改为使用异步请求。但我不认为这是一种更合适的方式。但在这种情况下,您不必弄乱线程。在iOS4+中,您可以使用grandcentraldispatch、Dispatch\u async
等,这比手动创建线程更简单。快速脏方法:
- (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),如果需要很长时间(您永远不知道您的用户在哪种网络上),您可以取消请求,并且您不必担心线程安全