Есть ли конкретная причина, по которой вы используете потоки?
Как насчет использования NSURLConnection? Вот кусок кода из моего проекта. Оба находятся в KANetworkManager. KANetworkTransactionType - это просто перечисление, которое помогает мне понять, как анализировать ответ.
+ (void) createAndStartUrlConnection:(NSMutableURLRequest *)request type:(KANetworkTransactionType)type target:(id)target callback:(SEL)callback;
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
NSDictionary *requestDict = [NSDictionary dictionaryWithObjectsAndKeys:request, @"request", [NSNumber numberWithInt:type], @"type", target, @"target", [NSValue valueWithPointer:callback], @"callback", nil];
[KANetworkManager performSelectorInBackground:@selector(makeNetworkCall:) withObject:requestDict];
}
Я могу сделать синхронный сетевой вызов, потому что я всегда вызываю этот метод в своем собственном потоке. Это более простой способ достижения асинхронного сетевого взаимодействия без работы с делегатами (хотя метод делегатов дает некоторые преимущества). Ваш метод parseResponse должен быть специфичен для любой отправляемой вами веб-службы. parseResponse уведомит метод обратного вызова. Дайте мне знать, если у вас есть дополнительные вопросы по этому поводу.
+ (void) makeNetworkCall:(NSDictionary *)params
{
// We assume this method won't be called from the main thread, so we need our own NSAutoreleasePool.
NSAutoreleasePool *autoreleasePool = [[NSAutoreleasePool alloc] init];
NSMutableURLRequest *request = [params objectForKey:@"request"];
KANetworkTransactionType type = [(NSNumber *)[params objectForKey:@"type"] intValue];
id target = [params objectForKey:@"target"];
SEL callback = (SEL)[[params objectForKey:@"callback"] pointerValue];
NSURLResponse *response;
NSError *err;
// We make a synchronous request assuming we're on a background thread.
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
if (data.length > 0)
{
[self parseResponse:data type:type target:target callback:callback];
}
else
{
NSLog(@"Error occured during network call. %@", err);
}
[autoreleasePool drain];
}