在NSURLConnection加载数据objective-c时执行一些任务

时间:2016-01-20 21:15:59

标签: ios objective-c nsurlconnection

我是iOS编程的初学者。我有一些NSURLConnection的问题:我已经安装了SWRevealViewController https://github.com/John-Lluch/SWRevealViewController,当我的应用程序从服务器加载数据时,我无法使用与屏幕的交互。加载数据时,我无法打开SWR菜单。

这是我在viewDidLoad中的SWR:

SWRevealViewController *revealViewController = self.revealViewController;
if ( revealViewController ) {
    [self.openMenyItmet setTarget: self.revealViewController];
    [self.openMenyItmet setAction: @selector( revealToggle: )];
    [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer];
}

之后,我在viewDidLoad中调用了Get方法:

[self GetQUIZ];

方法细节:

- (void)GetQUIZ {
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
NSString *url = [NSString stringWithFormat:@"http://stringlearning.com/api/v1/user-quiz?token=%@",[[NSUserDefaults standardUserDefaults] stringForKey:@"token"]];

[request setURL:[NSURL URLWithString: url]];
[request setHTTPMethod:@"GET"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setValue:[UIDevice currentDevice].name forHTTPHeaderField:@"device"];

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];
NSLog(@"Left menu, User details: %@", [[NSString alloc] initWithData:[request HTTPBody] encoding:NSUTF8StringEncoding]);
NSLog(@"%@", [request allHTTPHeaderFields]);

if(conn) {
    NSLog(@"Connection Successful");
} else
    NSLog(@"Connection could not be made");

然后我在connectionDidFinishLoading中使用数据:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSError *deserr = nil;
NSDictionary *responseDict = [NSJSONSerialization JSONObjectWithData:responseData options: 0 error: &deserr];

我读到我应该使用异步方法,但我以前从未使用过它。你会写一些细节解决方案吗? 也许,确实有不同的路径? 我非常感谢你的帮助!

3 个答案:

答案 0 :(得分:0)

我建议从NSURLSession开始,这是一个现代化的API,可以异步完成同样的事情。

要使用NSURLSession,您需要一些难题:

  1. 要访问的网址,以及可选的任何有效负载或自定义标头。
  2. NSURL的一个实例:您从哪里下载以及NSURLRequest将其包装。
  3. NSURLSessionConfiguration,用于处理缓存,凭据和超时等内容。
  4. 会话本身。
  5. 您需要NSURLSessionTask个实例。这是与NSURLConnection最接近的对象。它通过委托或完成块进行回调,如果你只需要知道它何时完成。
  6. 以下是代码中的外观:

        // 1. The web address & headers
    NSString *webAddress = [NSString stringWithFormat:@"http://stringlearning.com/api/v1/user-quiz?token=%@",[[NSUserDefaults standardUserDefaults] stringForKey:@"token"]];
    
    NSDictionary <NSString *, NSString *> *headers = @{
                                                       @"device" : [UIDevice currentDevice].name,
                                                       @"Content-Type" : @"application/x-www-form-urlencoded"
                                                       };
    
    // 2. An NSURL wrapped in an NSURLRequest
    NSURL* url = [NSURL URLWithString:webAddress];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
    // 3. An NSURLSession Configuration
    NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
    [sessionConfiguration setHTTPAdditionalHeaders:headers];
    
    // 4. The URLSession itself.
    NSURLSession *urlSession = [NSURLSession sessionWithConfiguration:sessionConfiguration];
    
    // 5. A session task: NSURLSessionDataTask or NSURLSessionDownloadTask
    NSURLSessionDataTask *dataTask = [urlSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    
    }];
    
    // 5b. Set the delegate if you did not use the completion handler initializer
    //    urlSession.delegate = self;
    
    // 6. Finally, call resume on your task.
    [dataTask resume];
    

    这将以异步方式运行,允许您的UI在应用加载数据时保持响应。

答案 1 :(得分:0)

当您在主线程上发送请求时,就像您现在所做的那样,您的UI(始终在主线程上执行)被阻止,等待请求完成并处理。因此,您应该在后台线程上异步执行所有网络。我建议先检查网络库AFNetworking ,它可以简化大多数网络问题。

答案 2 :(得分:0)

欢迎来到SO。您应该知道在iOS 9中不推荐使用NSURLConnection。您应该使用NSURLSession。方法非常相似。您可以使用您创建的NSURLRequest并将其传递给sharedSession对象,该对象是为异步请求设置的。处理它的最简单方法是使用调用dataTaskWithRequest:completionHandler:,它需要一个完成块。在完成块中,您提供了处理成功和失败的代码。