Почему мое приложение зависает, когда я делаю POST-запрос с NSURLRequest? - PullRequest
0 голосов
/ 01 декабря 2011

У меня есть такой метод. Он работает нормально, когда мое устройство подключено через сеть Wi-Fi, но когда оно подключено через сеть 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 Ответ

1 голос
/ 01 декабря 2011

Это замораживает ваше приложение, потому что вы сказали это. Вы сразу передали ДА в начало. Это означает, что он установит соединение в этом потоке и будет ждать его завершения. Я предполагаю, что поток, над которым вы это делаете, будет основным потоком, который также обрабатывает пользовательский интерфейс и т.д .:)

Вам нужно использовать что-то вроде connectionWithRequest:delegate: - это запустит запрос в фоновом режиме и сообщит вам, когда это будет сделано.

PS Причина, по которой вы не обнаружили ошибку в Wi-Fi, заключается в том, что данные были отправлены так быстро, что вы не заметили паузу в своем приложении:)

PPS Причина, по которой тайм-аут не устранил его, заключается в том, что время запроса не истекло - он просто получал данные очень медленно:)


EDIT

Примерно так:

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