NSThread过早终止

时间:2010-05-29 04:41:45

标签: iphone objective-c nsthread

我有一个应用程序通过适用于Mac / iPhone的GData ObjC客户端上传到Google Spreadsheets。它工作正常。我试图在自己的线程上获取上传部分,我试图在新线程上调用上传方法。

查找

-(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.
}

如果我忘记使用单独的线程,一切都会像它应该的那样工作。我是线程编程的新手,所以如果有什么我想念的,请告诉我!

谢谢!

2 个答案:

答案 0 :(得分:0)

我遇到了这个问题并且我有一个解决方案,然而,解决方案让我感到畏缩,因为它有效,但有些东西闻起来......似乎他们应该是一个更好的方式。

我怀疑[helper fetchUserSpreadsheetFeed]中的某个地方你正在使用某种形式的NSURLConnection。如果您正在使用异步http请求(您为回调函数等设置委托),则线程可能会在连接有机会调用这些回调函数并且无提示失败之前终止。这是我的解决方案,它使线程保持活动状态,直到回调将'finished'变量设置为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]];
}

}

我对这个解决方案的问题是旋转while循环通常不是好习惯。我不确定runloop业务的性质,它可能是正常睡觉和东西,但我不确定。

无论如何,你可以尝试一下,看看会发生什么!

注意:我的“WLUtilities”函数只是NSURLConnection函数的一个包装器,用于创建异步http请求。您可能尝试的另一个解决方案是使用同步请求但我不太喜欢这个解决方案,因为异步调用提供了对连接的更精细控制。

答案 1 :(得分:0)