0

我正在使用以下代码从服务器获取结果

        NSString *queryString = @"MyString"

        NSString *response = [NSString stringWithContentsOfURL:[NSURL URLWithString:queryString] encoding:NSUTF8StringEncoding error:&err];

        NSLog(@"%@",response);

        if (err != nil)
        {
            UIAlertView *alert = [[UIAlertView alloc]initWithTitle: @"Error"
                                                           message: @"An error has occurred. Kindly check your internet connection"
                                                          delegate: self
                                                 cancelButtonTitle:@"Ok"
                                                 otherButtonTitles:nil];
            [alert show];
            [indicator stopAnimating];
        }
        else
        {
//BLABLA
}

这段代码的问题是,如果服务器显示滞后并且需要 3 秒才能获得此响应

NSString *response = [NSString stringWithContentsOfURL:[NSURL URLWithString:queryString] 

我的 iPhone 屏幕卡住了 3 秒。我怎样才能让它在后台运行,这样它就不会减慢或卡住手机

问候

4

2 回答 2

1

您正在做的是从主线程发送 HTTP 请求。正如你所说,这会堵塞用户界面。您需要生成一个后台线程并向您的服务器发出请求,当响应返回时,您需要从主线程更新 UI。这是 UI 编码中的常见模式。

__block__  NSString *response;

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{

    //your server url and request. data comes back in this background thread
    response; = [NSString stringWithContentsOfURL:[NSURL URLWithString:queryString] encoding:NSUTF8StringEncoding error:&err];

    dispatch_async(dispatch_get_main_queue(), ^{
        //update main thread here.
        NSLog(@"%@",response);

        if (err != nil)
        {
            UIAlertView *alert = [[UIAlertView alloc]initWithTitle: @"Error"
                                                           message: @"An error has occurred."
                                                          delegate: self
                                                 cancelButtonTitle:@"Ok"
                                                 otherButtonTitles:nil];
            [alert show];
            [indicator stopAnimating];
        }
    });
});

你也可以performSelectorInBackground:withObject:用来生成一个新线程,然后执行的选择器负责设置新线程的自动释放池、运行循环和其他配置细节——参见Apple线程编程指南中的“使用 NSObject 生成线程”

正如我在上面发布的那样,使用Grand Central Dispatch可能会更好。GCD 是一种较新的技术,在内存开销和代码行方面效率更高。

于 2013-01-23T08:22:42.737 回答
-1

您可以使用ASIHTTPRequest,它是我最喜欢的获取和发送信息的工具。

于 2013-01-23T08:23:45.410 回答