Почему мое приложение замораживает, когда я делаю запрос на сообщение с nsurlrequest?
-
26-10-2019 - |
Вопрос
У меня есть такой метод. Он работает нормально, когда мое устройство подключено через сеть Wi -Fi, но когда оно подключено через сеть 3G, оно замораживает мое приложение в течение нескольких секунд. Таким образом, поскольку это интерактивное приложение, когда оно выполняет какой -то различный запрос POST, оно должно продолжать работать, чтобы пользователь мог продолжать использовать приложение. Любое решение для этого?
Я попытался уменьшить [ThestQuest 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
}
Решение
Это замораживает ваше приложение, потому что вы сказали его. Вы прошли да в начало. Это означает, что он запустит соединение в этом потоке и подождет, пока оно не закончится. Я предполагаю, что нить, в которой вы делаете это, будет основной темой - той, которая также обрабатывает пользовательский интерфейс и т. Д. :)
Вам нужно использовать что -то вроде connectionWithRequest:delegate:
- Это запустит запрос в фоновом режиме и скажет вам, когда это будет сделано.
PS Причина, по которой вы не заметили ошибку в Wi -Fi, заключается в том, что данные были отправлены так быстро, что не могли заметить паузу в своем приложении :)
PPS причина, по которой тайм -аут не исправил его, заключается в том, что запрос не был выведен - он просто получил данные очень медленно :)
РЕДАКТИРОВАТЬ
Что-то вроде этого :
self.web = [NSURLConnection connectionWithRequest:request delegate:self];