2010-05-29 5 views
1

У меня есть приложение, которое загружается в Google Spreadsheets через клиент GData ObjC для Mac/iPhone. Он отлично работает, как есть. Я пытаюсь получить часть загрузки в своем собственном потоке, и я пытаюсь вызвать метод загрузки в новом потоке.NSThread завершение слишком рано

Посмотрите:

-(void)establishNewThreadToUpload { 
    [NSThread detachNewThreadSelector:@selector(uploadToGoogle) toTarget:self withObject:nil]; 
} 

-(void)uploadToGoogle { 
    NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init]; 
    //works fine 
    [helper setNewServiceWithName:username password:password]; 
    //works fine 
    [helper fetchUserSpreadsheetFeed]; 
    //inside the helper class, fetchUserSpreadsheet feed calls ANOTHER method, which 
    //calls ANOTHER METHOD and so on, until the object is either uploaded or fails 
    //However, once the class gets to the end of fetchUserSpreadsheetFeed 
    //control is passed back to this method, and 
    [pool release]; 
    //is called. The thread terminates and nothing ever happens. 
} 

Если я забываю об использовании отдельного потока, все работает, как это предполагается. Я новичок в программировании потоков, поэтому, если что-то мне не хватает, пожалуйста, подскажите мне!

Спасибо!

+1

Что «Нить заканчивается и никогда ничего не происходит» означает? –

ответ

0

У меня была эта проблема, и у меня есть решение, однако, вид решения заставляет меня съеживаться, поскольку это работает, но что-то пахнет этим ... кажется, что их должно быть лучше.

Я подозреваю, что где-то внутри [helper fetchUserSpreadsheetFeed] вы используете какую-то форму NSURLConnection. Если вы используете асинхронный HTTP-запрос (где вы настраиваете делегат для функций обратного вызова и т. Д.), Поток может завершиться до того, как соединение сможет вызвать эти функции обратного вызова и тихо провалится. Вот мое решение, которое поддерживает поток до тех пор, пока обратные вызовы не установят «законченную» переменную в YES. (Я, кажется, есть проблема проводки код в этих текстовых полях, если те ангелы, которые работают вокруг редактирования материала может помочь мне, что было бы здорово!)

- (void)fetchFeed { 
//NSLog(@"making request"); 
[WLUtilities makeHttpRequest:self.feedUrlString withHttpHeaders:nil withDelegate:self]; 

//block this thread so it's still alive when the delegates get called 
while(!finished) { 
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
} 

}

У меня есть проблема с это решение состоит в том, что вращение в то время как петли обычно не являются хорошей практикой. Я не уверен в том, что касается бизнеса runloop, но это может быть сон и прочее, но я не уверен.

Во всяком случае, вы могли бы попробовать попробовать и посмотреть, что произойдет!

ПРИМЕЧАНИЕ: моя функция «WLUtilities» - это всего лишь оболочка вокруг функции NSURLConnection для создания асинхронного HTTP-запроса. Еще одно решение, которое вы можете попробовать, - это просто использовать запрос синхронизации, но мне не нравится это решение, потому что асинхронный вызов обеспечивает более тонкий контроль над соединением.

+0

Том, ты прав. Клиент ObjC GData использует асинхронные переключения обратного вызова. метод fetchSpreadsheetFeed никогда не переходит к своей функции обратного вызова. Я собираюсь дать вашему решению попробовать. Спасибо, что подняли голову – Justin

Смежные вопросы