尽管在后台线程中调用了一个冗长的方法,UI仍会挂起

时间:2011-11-21 13:03:32

标签: iphone ios multithreading

我在background.now中调用一个类似methodA的方法,如果我从methodA中调用一个名为methodB的冗长方法。我会分别提到它在后台。我问这个问题的原因是在后台调用漫长的过程线程,ui挂了一段时间。

   [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];
    }

是这种调用背景方法的方法吗?

1 个答案:

答案 0 :(得分:1)

如果在某个线程(无论是后台线程还是主线程)上调用选择器(方法)X,则X调用的任何选择器(以传统方式)也在同一线程上。所以不,只要入口点选择器在'正确'的线程上,你就不需要为来自performSelectorInBackground:的每个子调用调用methodA:,它所做的任何事情也都在'正确'的线程,包括对其他方法的调用。

请注意,您在methodB中设置的NSAutoreleasePool看起来不必要 - 您实际上并不需要它,因为您已经在NSAutoreleasePool中设置methodA的范围内}。 (假设methodB仅从示例中的methodA调用!)

很明显,您是否已让NSLogs完全确认//some lengthy process实际上是一直在进行的事情?