目标C - Ajax冻结屏幕



我是iOS世界的新手,也是Objective - C编程的新手。
我正在为iPad和iPhone做一个基本的iOS应用程序,有一个初始登录屏幕。有时它工作得很好,但当我点击登录按钮时,它只是冻结屏幕并阻止应用程序执行。我认为这是ajax进程的问题,但就像我说的,我是新的…

这是我调用API检查凭据的代码:

        NSString   *password   = @"XXXXXXXXXX";
        NSString   *joinString = [NSString stringWithFormat:@"%@%@%@%@%@",@"http://www.example.com?view=checks&tmpl=json&c=",input,@"&p=",password,@"&onlymail"];
        NSLog(@"calling: %@", joinString);
        NSURL      *url        = [NSURL URLWithString:joinString];
        NSData     *data       = [NSData dataWithContentsOfURL:url];
        NSString   *ret        = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

        NSString *returned = [ret stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceCharacterSet]];
        NSLog(@"returned: %@", returned);
        if([returned length] != 0 && ![returned isEqual:@""] && ![returned isEqual:NULL])
        {
            NSLog(@"Connection Successful: %@", ret);
            return returned;
        }
        else
        {
            NSLog(@"Connection could not be made");
            return @"";
        }


更新代码

        NSString   *password   = @"XXXXXXXXX";
        NSString   *joinString = [NSString stringWithFormat:@"%@%@%@%@%@",@"http://www.example.com/index.php?view=checks&tmpl=json&c=",input,@"&p=",password,@"&onlymail"];
        NSURL      *url        = [NSURL URLWithString:joinString];
       [NSData dataWithContentsOfURL:url];

        [[[NSURLSession sharedSession]
           dataTaskWithURL:url
           completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
        {
              if (data != nil && error == nil)
              {
                   NSString *returned = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
                   if([returned length] != 0 && ![returned isEqual:@""] && ![returned isEqual:NULL])
                   {
                       NSLog(@"Connection Successful: %@", returned);
                   }
                   else
                   {
                       NSLog(@"Connection could not be made");
                   }
              }
              else
              {
                  NSLog(@"error: %@",error.localizedDescription);
              }
         }] resume];


我知道我的代码是不完美的,所以请给我一些建议关于解决这个问题或者只是为了提高我在iOS开发中的最佳实践。

非常感谢。

[NSData dataWithContentsOfURL:url];

上面的调用是同步的,如果你的代码在主线程中运行,线程将被阻塞,UI将冻结,直到上面的调用返回。您应该始终尝试异步执行长时间运行(或与网络相关)的操作,在您的情况下,我会查看:

[[[NSURLSession sharedSession]
  dataTaskWithURL:url
        completionHandler:^(NSData *data,
                            NSURLResponse *response,
                            NSError *error) {
            // handle response
        }] resume];

最新更新