0

我在 applicationDidBecomeActive 方法中从服务器获取数据。当网络连接速度太慢时,应用程序不断崩溃。我不知道如何处理这个问题。任何帮助将不胜感激。提前致谢。

NSString *post =[[NSString alloc] initWithFormat:@"=%@@=%@",myString,acMobileno];

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http:///?data=%@&no=%@",myString,acMobileno]];

    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];

    [request setURL:url];
    [request setHTTPMethod:@"POST"];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setHTTPBody:postData];

    NSError *error1 = [[NSError alloc] init];
    NSHTTPURLResponse *response = nil;
    NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error1];
    NSString *string;
    if ([response statusCode] >=200 && [response statusCode] <300)
            {
            string = [[NSString alloc] initWithData:urlData encoding:NSMacOSRomanStringEncoding];

            }
4

2 回答 2

1

它可能会崩溃,因为连接已经开始下载,但它还没有完成,因此允许编译器传递你的 if 语句,这将不可避免地给出一个 nilurlData参数。

要解决此问题,您应该检查是否有错误,然后检查下载的响应标头。另外,我建议在后台线程上运行此操作,这样它就不会阻碍用户体验 - 目前,应用程序将延迟启动,具体取决于文件大小和用户的下载速度。

NSError *error1 = nil;
NSHTTPURLResponse *response = nil;
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error1];
NSString *string = nil;
if (error != nil && ([response statusCode] >=200 && [response statusCode] <300)){ 
    string = [[NSString alloc] initWithData:urlData encoding:NSMacOSRomanStringEncoding];
}
else {
    NSLog(@"received error: %@", error.localizedDescription);
}

dispatch_async对于后台线程,在语句中运行上述代码,或-sendAsynchronousRequest:使用-sendSynchronousRequest.

或者,正如@Viral 所说,请求可能花费的时间太长,并且由于同步请求在加载 UI 之前未完成而导致应用程序挂起。

于 2013-04-17T07:02:44.327 回答
1

很可能是由于应用程序的委托方法中的同步调用。加载 UI 花费了太多时间(因为互联网连接速度很慢,并且您在主线程上调用 Web 服务);因此操作系统认为您的应用程序由于 UI 无响应而挂起,并使应用程序本身崩溃。

FirstViewController仅出于调试目的,在您的viewDidAppear方法中尝试相同的代码。它应该在那里工作正常。如果是这样,您需要将调用更改为其他地方(也最好在某个后台线程或异步中)。

编辑:虽然,如果它在其他地方工作,您需要将调用更改为异步或后台线程上的更流畅的用户体验。

于 2013-04-17T07:06:43.150 回答