2011-11-21 42 views
0

我打电话就像一个了methodA方法background.now如果我所说的从methodA.should所谓的methodB漫长的方法我单独提到这是在background.the我之所以问这个问题是,尽管在后台线程中调用了冗长的进程,但ui挂了一段时间。UI挂起inspite调用后台线程漫长的方法

[self performSelectorInBackground:@selector(methodA)]; 


    -(void)methodA 
    { 
    NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; 
    [self methodB]; 
    [pool drain]; 
    } 

    -(void)methodB 
    { 
    NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; 
    //some lengthy process 

    [self performSelectorOnMainThread:@selector(updateTable) withObject:nil waitUntilDone:NO]; 
    [pool drain]; 
    } 
    -(void)updateTable 
    { 
    [self.tableview reloadData]; 
    } 

是调用后台方法正确的这种方式?

+0

如果的methodB只从被称为了methodA的NSAutoreleasePool中的methodB可能有些过分 - 你已经由一个在了methodA建立覆盖。 – occulus

+0

当你说用户界面挂起,你的意思是它完全没有响应和/或动画停止?更多细节请... – occulus

+0

我看不出任何明显的错误与上面的代码。发布简化的演示代码而不是实际的代码可能会隐藏问题的症结所在。你能发布更多有问题的实际代码吗? – occulus

回答

1

如果一个选择器(方法)X上调用某线程(无论它是背景或主线程),即X呼叫(以常规方式)的任何选择也是该同一线程。所以,不,你不需要调用performSelectorInBackground:methodA:每个子通话只要入口点选择是“正确的”的线程,那么任何它也是对“正确”的主题,包括调用其他方法。

注意,NSAutoreleasePool你的methodB设置看起来不必要的 - 你并不真的需要它,因为你已经在methodA成立NSAutoreleasePool的范围内。 (假设methodB只从methodA称为作为例子!)

顺便说一句,你放在NSLogs绝对验证//some lengthy process实际上是把所有的时间的事情吗?

+0

ya冗长的过程是迭代...我循环一些计算大约100次......这实际上需要时间......没有涉及ui的东西在计算中...... – sujith1406

相关问题