我要去尝试解释这个,而不显示任何代码,因为我不认为我需要...iOS线程,第二个线程看不到变量?
我有一个对象,我创建了包含数据和多种方法来访问数据网络服务器,在这种情况下,它然后填充所述数据以供以后检索。
在主线程中,当视图初始化时,我使用它需要访问数据的URL初始化此对象。这就是它初始化时所做的一切......然后,一旦视图加载,我就调用其中一个对象的方法,然后从Web服务器获取数据。对于正在检索的数据,这可能需要几秒或更长的时间。之后,我可以调用其他方法来获取我需要的各种数据。
我的问题是我似乎无法找到最好的方式去把它放到另一个线程。做一个简单的performSelectorInBackground似乎不起作用,因为初始化视图时初始化的对象无法访问。第二个线程无论如何都无法看到它。理论上,我可以初始化对象并运行我需要在第二个线程内运行的方法。然后将对象传递回主线程......我正在寻找可能做一个performSelectorOnMainThread并以这种方式传回对象。这会起作用吗?
理想的情况下,这将是不错的东西,可以让我:
- 运行一些代码在另一个线程...
- 等待该程序代码来完成...
- 继续上与该计划的其余部分。
它似乎不是那么容易不幸。任何帮助指出我在这里正确的方向将不胜感激。或者至少证明我关于传回物体的理论就足够了。
编辑:如何读取和修改我的视图控制器的头文件中定义的实例变量?当我在第二个线程中运行的方法中放置一个断点时,就像变量尚未初始化。
EDITx2:
- (id)initWithText:(NSString *)strURL{
if (self) {
// Custom initialization
osSearch = [[orgSearch alloc] initWithurl:strURL];
}
return self;
}
- (void)viewDidLoad{
[self loadSearches];
[super viewDidLoad];
}
- (void)loadSearches{
[self performSelectorInBackground:@selector(workerThread) withObject:nil];
}
-(void) workerThread{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[osSearch go];
[self performSelectorOnMainThread:@selector(returnToMain) withObject:nil waitUntilDone:FALSE];
[pool release];
}
-(void)returnToMain{
UITableView* tblView = tableView;
tblView.frame = CGRectMake(0,28,320,387);
[tblView release];
}
osSearch是我试图访问该对象,但它似乎正在dealloced我所有的ivars。如果我在performSelectorInBackground上放置一个中断,我可以看到osSearch已正确初始化。一旦我进入workerThread,它就像从来没有。我可以注释掉“去”的电话,然后回到主线程,它仍然看起来像从未被初始化过。
就像一个测试,我创建了一个新的项目,使用相同的线程方法和对象,我能够创建新线程并访问视图的ivars和对象ivars就好。我不明白这里发生了什么。我唯一的猜测是垃圾收集者不喜欢我,但那只是一个猜测。再次,任何帮助将是伟大的。
当你坐在那里等待线程完成时,为什么要在线程中运行它? –
因为我不是唯一一个会使用它的人,并且如果它看起来像是悬挂的,因为没有加载指示符,用户会假设某些功能无法正常工作。 – Scott