Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 使用NSURLConnection执行sendSynchronousRequest时显示加载屏幕_Iphone_Ios - Fatal编程技术网

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

Iphone 使用NSURLConnection执行sendSynchronousRequest时显示加载屏幕,iphone,ios,Iphone,Ios,当按下按钮时,我需要登录。调用sendSynchronousRequest时,我希望有一个“加载”指示器。我知道在我发出URL请求之前添加加载屏幕是不起作用的,因为直到URL请求返回结果后才到达显示代码。我尝试了几件事: 使用通知中心:添加观察者并发送消息,然后启动加载屏幕。在选择器中执行实际请求(删除加载视图)。这似乎不起作用 为URL请求创建一个单独的线程(在非web/非主线程中使用web块时给了我一个奇怪的错误) 为加载视图创建一个单独的线程(没有显示任何内容!) 我想得到两个答案:1

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

  • 使用通知中心:添加观察者并发送消息,然后启动加载屏幕。在选择器中执行实际请求(删除加载视图)。这似乎不起作用
  • 为URL请求创建一个单独的线程(在非web/非主线程中使用web块时给了我一个奇怪的错误)
  • 为加载视图创建一个单独的线程(没有显示任何内容!)
我想得到两个答案:1)使用iOS 3.2+的快速、肮脏(但功能强大)的方法是什么?2) 正确的方法是什么?:)


谢谢

如果你想同步完成,你需要在主线程之外的另一个线程中完成,如果你想让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),如果需要很长时间(您永远不知道您的用户在哪种网络上),您可以取消请求,并且您不必担心线程安全