2014-03-31 47 views
1

我有一个将UIView元素添加到另一个父级UIView的线程。我试图每秒添加一个,但是直到整个循环完成后才显示它们。请参阅下面的代码。添加到子视图中的项目不会增量显示

-(void)buttonClicked:(id)sender { 
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(addSubViews) object:nil]; 
    [thread start]; 
} 

-(void)addSubViews { 
    for(int i = 0; i < 10; i++) { 
     UIView *view = [[UIView alloc] initWithFrame:CGRectMake(i, 0, 10, 10)]; 
     [parentView addSubview:view]; 
     [NSThread sleepForTimeInterval:1]; 
    } 
} 

我期望看到这些视图一次添加一个,每1秒钟一次。然而,在整个循环完成之前,父视图中没有任何显示。有任何想法吗?

回答

0

Gack。忘记你曾经知道睡眠。真。

你不能从后台线程做UI代码。

直到下一次通过事件循环才能更改应用的UI。您需要返回并让系统处理您的代码。更多的东西是这样的:

标题:

@interface MyVC: UIViewController 
{ 
    int viewIndex; 
} 

身体:

#define K_MAX_VIEWS 10 

@implementation MyVC 

-(void)buttonClicked:(id)sender 
{ 
    viewIndex = 0; 
    [self addViews]; 
} 

- (void) addViews; 
{ 
    if (viewIndex < K_MAX_VIEWS) 
    { 
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(i*15, 0, 10, 10)]; 
    [parentView addSubview:view]; 
    view.layer.borderWidth = 1.0 //Testing: Box the view so you can see it. 
    viewIndex++; 
    [self performSelector: @selector(addViews) withObject: nil afterDelay: 1]; 
    } 
} 
@end 


此代码使用实例变量来跟踪它添加视图的索引。它添加了一个视图,然后在拨打performSelector:withObject:afterDelay:后返回。此方法延迟后调度主线程的未来呼叫。这就是你想要处理这个问题的方法。

请注意,作为此代码的结果,您可能不会看到任何东西,除非您将视图添加到显示视图中。这就是为什么我添加了行view.layer.borderWidth = 1.0

0

UIKit不是线程安全的,因此所有对它的调用都必须在主线程上进行。试试这个:

-(void)addSubViews { 
    for(int i = 0; i < 10; i++) { 
     dispatch_sync(dispatch_get_main_queue(), ^{ 
      UIView *view = [[UIView alloc] initWithFrame:CGRectMake(i, 0, 10, 10)]; 
      [parentView addSubview:view]; 
     }); 
     [NSThread sleepForTimeInterval:1]; 
    } 
} 
0

不要使用NSThread,使用GCD。例如:

-(void)buttonClicked:(id)sender { 
    [self addSubViews]; 
} 

-(void)addSubViews { 

    for (int i = 0; i < 10; i++) { 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     UIView *view = [[UIView alloc] initWithFrame:CGRectMake(i, 0, 10, 10)]; 
     [parentView addSubview:view]; 
     [NSThread sleepForTimeInterval:1.0]; 
    }); 

    } 
} 

说明:您将10个异步任务添加到子视图并等待1秒钟到主队列。

相关问题