2009-09-18 5 views
0

Я реализую загрузку данных на сервере сервером, создавая NSOperation и открывая NSURLConnections синхронно.NSURLConnection Crashing

Этот код отлично работал как на симуляторе, так и на устройстве, пока я не добавил индикатор выполнения с уведомлениями, возвращающимися в основной поток.

- (void)start { 
    // stop execution if it's cancelled 

    if([self isCancelled]) { 
      [self willChangeValueForKey:@"isFinished"]; 
      finished = YES; 
      [self didChangeValueForKey:@"isFinished"]; 
      return; 
    } 

    // If the operation is not canceled, begin executing the task. 
    [self willChangeValueForKey:@"isExecuting"]; 
    [NSThread detachNewThreadSelector:@selector(main) toTarget:selfwithObject:nil]; 
    executing = YES; 
    [self didChangeValueForKey:@"isExecuting"]; 
} 

Теперь я получаю аварийные сообщения EXC_BAD_ACCESS при синхронном вызове.

NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/index.php", rootURL]]; 
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url]; 
[urlRequest setHTTPMethod:@"POST"]; 
[urlRequest setHTTPBody:[bodyString dataUsingEncoding:NSUTF8StringEncoding]]; 
[[NSURLCache sharedURLCache] removeAllCachedResponses]; 
[[NSURLCache sharedURLCache] setMemoryCapacity:0]; 
[[NSURLCache sharedURLCache] setDiskCapacity:0]; 

NSError *error = nil; 
NSURLResponse *response = nil; 
receivedData = [[NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&response error:&error] mutableCopy]; 

StackTrace работает следующим образом:

#0 0x3430debc in objc_msgSend() 
#1 0x3136f996 in NSPopAutoreleasePool() 
#2 0x31374160 in -[NSAutoreleasePool release]() 
#3 0x331a0408 in _UIApplicationHandleEvent() 
#4 0x325339c4 in PurpleEventCallback() 
#5 0x3147a52a in CFRunLoopRunSpecific() 
#6 0x31479c1e in CFRunLoopRunInMode() 
#7 0x3314ec08 in -[UIApplication _run]() 
#8 0x3314d230 in UIApplicationMain() 
#9 0x00002ab0 in main (argc=1, argv=0x2ffff504) 

С NSZombieEnabled, я получаю

*** -[NSDateComponents release]: message sent to deallocated instance 0x172fd0 

Я знаю, что соединение установлено (посмотрел на логи сервера, и запрос проходит). Объект NSDateComponent не размещается нигде в коде NSOperation до NSURLConnection.

Я пытался выяснить, что я неожиданно сделал с NSURLConnection, чтобы он меня так ненавидел.

Любая помощь очень ценится!

ответ

0

Я также разместил этот вопрос на форумах разработчиков и получил предложение об удалении параллелизма. Я удалил оскорбительную строку:

[NSThread detachNewThreadSelector:@selector(main) toTarget:selfwithObject:nil]; 

Я также остановил отмену начала и только перевернул главный.

NSURLConnection остановился.

1

Хотя я точно не знаю, в чем проблема, я знаю, что случайно использовал случайные ошибки и сбои при использовании NSURLConnection. Затем я нашел ASIHTTPRequest и никогда не оглядывался назад. Это замена замены NSURLConnection и запуск CFNetwork. Он очень стабилен (я использую его во всех моих проектах) и поставляется с множеством положительных героев, таких как встроенная поддержка прокрутки и частичное скачивание. Он даже может писать прямо на диск, чтобы сэкономить на ОЗУ, что важно для iPhone.

+0

Просто попробовал использовать ASIHTTPRequest, и при попытке распаковать мои данные ответа возникают ошибки. Никогда не случалось с NSURLConnection. – serpah