Objective C - Ajax冻结屏幕

时间:2015-09-08 09:26:16

标签: ios objective-c iphone ajax ipad

我是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开发中的最佳实践。

非常感谢你。

1 个答案:

答案 0 :(得分:0)

[NSData dataWithContentsOfURL:url];

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

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

        }] resume];