当我使用NSURLRequest发出POST请求时,为什么我的应用程序会冻结?

时间:2011-12-01 11:29:52

标签: iphone objective-c nsmutableurlrequest

我有这样的方法。当我的设备通过wifi网络连接时,它工作正常,但当它通过3G网络连接时,它会冻结我的应用程序几秒钟。 因此,因为它是一个交互式应用程序,当它执行一些不同的发布请求时,它必须继续运行,以便用户可以继续使用该应用程序。 对此有何解决方案?

我尝试减少[theRequest setTimeoutInterval:2.0];但这并没有解决我的问题。

// post request
    - (void)postRequestWithURL:(NSString *)url 
                                body:(NSString *)body 
                         contentType:(NSString *)contentType 
                             options:(NSDictionary *)dict
    {
        // set request
        NSURL *requestURL = [NSURL URLWithString:url];
        NSMutableURLRequest *theRequest = [[NSMutableURLRequest alloc] init];


        if([dict count] > 0)
        {
            for (id key in dict) {
                NSLog(@"[theRequest addValue:%@ forHTTPHeaderField:%@]", [dict valueForKey:key], key);
                [theRequest addValue:[dict valueForKey:key] forHTTPHeaderField:key];
            }
        }

        if (contentType != nil) {
            [theRequest addValue:contentType forHTTPHeaderField:@"Content-type"];
        }

        [theRequest setURL:requestURL];
        [theRequest setTimeoutInterval:2.0];
        [theRequest setHTTPMethod:@"POST"];
        [theRequest setHTTPBody:[body dataUsingEncoding:NSASCIIStringEncoding]];
        [self.oauthAuthentication authorizeRequest:theRequest];
        // make request
        //responseData = [NSURLConnection sendSynchronousRequest:theRequest 
        //                                   returningResponse:&response 
        //                                               error:&error]; 

        NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES];
        self.web = conn;

        [conn release];

        NSLog(@"########## REQUEST URL: %@", url);




        // request and response sending and returning objects
    }

1 个答案:

答案 0 :(得分:1)

它冻结了你的应用程序,因为你告诉了它。你已经将YES传递给了startImmediately。这意味着它将在该线程上启动连接并等待它完成。我猜你正在执行此操作的主题将是主线程 - 也是处理ui等的线程:)

您需要使用类似connectionWithRequest:delegate:的内容 - 这会在后台运行请求并告诉您何时完成。

PS你没有发现wifi中的错误的原因是因为数据发送速度太快你无法注意到应用中的暂停:)

PPS超时没有解决问题的原因是因为请求没有超时 - 这只是让数据变得非常缓慢:)


修改

这样的事情:

self.web = [NSURLConnection connectionWithRequest:request delegate:self];