2011-10-15 34 views
1

我要去尝试解释这个,而不显示任何代码,因为我不认为我需要...iOS线程,第二个线程看不到变量?

我有一个对象,我创建了包含数据和多种方法来访问数据网络服务器,在这种情况下,它然后填充所述数据以供以后检索。

在主线程中,当视图初始化时,我使用它需要访问数据的URL初始化此对象。这就是它初始化时所做的一切......然后,一旦视图加载,我就调用其中一个对象的方法,然后从Web服务器获取数据。对于正在检索的数据,这可能需要几秒或更长的时间。之后,我可以调用其他方法来获取我需要的各种数据。

我的问题是我似乎无法找到最好的方式去把它放到另一个线程。做一个简单的performSelectorInBackground似乎不起作用,因为初始化视图时初始化的对象无法访问。第二个线程无论如何都无法看到它。理论上,我可以初始化对象并运行我需要在第二个线程内运行的方法。然后将对象传递回主线程......我正在寻找可能做一个performSelectorOnMainThread并以这种方式传回对象。这会起作用吗?

理想的情况下,这将是不错的东西,可以让我:

  1. 运行一些代码在另一个线程...
  2. 等待该程序代码来完成...
  3. 继续上与该计划的其余部分。

它似乎不是那么容易不幸。任何帮助指出我在这里正确的方向将不胜感激。或者至少证明我关于传回物体的理论就足够了。

编辑:如何读取和修改我的视图控制器的头文件中定义的实例变量?当我在第二个线程中运行的方法中放置一个断点时,就像变量尚未初始化。

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就好。我不明白这里发生了什么。我唯一的猜测是垃圾收集者不喜欢我,但那只是一个猜测。再次,任何帮助将是伟大的。

+0

当你坐在那里等待线程完成时,为什么要在线程中运行它? –

+0

因为我不是唯一一个会使用它的人,并且如果它看起来像是悬挂的,因为没有加载指示符,用户会假设某些功能无法正常工作。 – Scott

回答

0

1)iOS中没有垃圾回收。内存管理行为将始终如一,直至您自己的代码的非确定性行为(例如竞争条件)。

如果相同的代码在一个新的项目工程,那么无论它是不完全一样的代码,或它的工作原理是机会(访问解除分配的对象可以工作偶尔,它只是在等待,虽然发生崩溃),或你的代码中有一些非确定性条件释放对象。

2)要做到这一点:

运行一些代码在另一个线程...

等待该程序代码来完成...

继续与该程序的其他部分。

您可以使用下列之一:

  1. performSelector ...的方法的家庭,就像你使用它们。

  2. dispatch_async功能系列 - 查找它,你会发现很多 的例子。

  3. 将NSInvocationOperation/NSBlockOperation与一个完成块 一起使用,它将控制权转移回主线程。

  4. 专门针对HTTP请求,您可以使用ASIHTTPRequest(也在内部使用NSOperation,但为请求的进度提供了许多额外的功能和回调)。

+0

嗯,有些东西在这里不起作用......显然它与线程无关,因为它好像是我的ivars在视图加载后正在处理。我将不得不进一步研究这一点。我要完全重写那个视图并仔细检查一切。谢谢你的帮助。 – Scott