2013-04-05 107 views
1

我正在使用GCD为我的滚动视图加载图像,而不是跟随我创建的框架,这使得图像只闪烁通过一帧。这里是我的代码:GCD滚动查看加载问题

//Create the array  
-(void)awakeFromNib { 

images = [NSMutableArray arrayWithObjects: [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"imageOne" ofType:@"png"]], [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"imageTwo" ofType:@"png"]], [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"imageThree" ofType:@"png"]],nil]; 

} 

//Populate scrollview 
-(void)populate { 

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul); 


scrollview.pagingEnabled = YES; 
scrollview.backgroundColor = [UIColor clearColor]; 
scrollview.clipsToBounds = YES; 
scrollview.delegate = self; 

[scrollview setContentSize:CGSizeMake(2 * scrollview.frame.size.width, scrollview.frame.size.height)]; 

int number = [images count] ; 
NSLog(@"%i",images); 

int rowTwoInt = 0; 
int rowThreeInt = 0; 
int rowFourInt = 0; 

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



    if (i <= 3) { 

     finalFrame = CGRectMake(i*(80), 12, 80, 80); 
    } 

    if (i == 4) { 
     finalFrame = CGRectMake(0, 95, 80, 80); 
    } 
    if ((i >4) && (i <= 7)) { 
     rowTwoInt = rowTwoInt + 80; 
     finalFrame = CGRectMake(rowTwoInt, 95, 80, 80); 
    } 

    if (i == 8) { 
     finalFrame = CGRectMake(0, 178, 80, 80); 
    } 
    if ((i > 8) && (i <= 11)) { 
     rowThreeInt = rowThreeInt + 80; 
     finalFrame = CGRectMake(rowThreeInt, 178, 80, 80); 
    } 


    if (i == 12) { 
     finalFrame = CGRectMake(0, 261, 80, 80); 
    } 
    if ((i > 12) && (i <= 15)) { 
     rowFourInt = rowFourInt + 80; 
     finalFrame = CGRectMake(rowFourInt, 261, 80, 80); 
    } 


    IconButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    IconButton.frame = CGRectMake(0, 0, 57, 57); 
    IconButton.center = CGPointMake(40, 29); 

    [IconButton addTarget:self action:@selector(Selected:) forControlEvents:UIControlEventTouchUpInside]; 
    IconButton.tag = i; 



    dispatch_async(queue, ^{ 
     UIImage *icon = [images objectAtIndex:i]; 

     dispatch_sync(dispatch_get_main_queue(), ^{ 
      [IconButton setImage:icon forState:UIControlStateNormal]; 

     }); 
    }); 



    [cell addSubview:IconButton]; 


     cell = [[UIView alloc] initWithFrame:finalFrame]; 
[scrollview addSubview:cell]; 

那我做错了什么?我是GCD的新手,所以它可能就是这样。另外,如果您看到一种提高UIScrollView性能的方法,请告诉我。

+0

请修复您的代码以正确缩进。另外,告诉我们如何声明'IconButton'。 – 2013-04-05 23:51:14

回答

2

我怀疑你已经声明IconButton作为实例变量,static变量或全局变量。

每次通过循环时,都会更改IconButton的值。当您执行12个队列块时,IconButton被设置为其最终值 - 对您创建的最后一个按钮的引用。所有块都使用实例(或static或全局变量),因此所有块都会更新相同的最终按钮。

使一个局部变量来引用按钮,和使用,在循环局部变量:

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
IconButton = button; 
IconButton.frame = CGRectMake(0, 0, 57, 57); 
... 

dispatch_async(queue, ^{ 
    UIImage *icon = [images objectAtIndex:i]; 

    dispatch_sync(dispatch_get_main_queue(), ^{ 
     [button setImage:icon forState:UIControlStateNormal]; 

    }); 
}); 

每个块将在块产生的力矩捕获局部变量的值,所以每个块将捕获对不同按钮的引用。