Asynchronus for loop in iphone

放肆的年华 提交于 2020-01-22 03:21:10

问题


the for loop looks like this , which i have written in view did load, so it takes more time to load this page.

for (int i=3; i<[[[[dataDict objectForKey:@"rss"]objectForKey:@"channel"]objectForKey:@"item"]count]; i++)
{


    if (i%3==0)
    {
        x=0;
        y++;
    }

    view=[[UIView alloc]initWithFrame:CGRectMake((x*250)+5, (y*404)+6, 244, 400)];
    [view setBackgroundColor:[UIColor whiteColor]];
    view.layer.borderColor=[[UIColor whiteColor]CGColor];
    view.layer.borderWidth=1.0;
    view.layer.cornerRadius = 5;
    view.layer.masksToBounds = YES;
    [scroller addSubview:view];

titlelabel=[[UILabel alloc]initWithFrame:CGRectMake(10, 10, 230, 20)];
    [titlelabel setText:[[[[[[dataDict objectForKey:@"rss"]objectForKey:@"channel"]objectForKey:@"item"]objectAtIndex:i]objectForKey:@"title"]objectForKey:@"text"]];
    [titlelabel setNumberOfLines:0];
    titlelabel.font=[UIFont boldSystemFontOfSize:15.0f];




    [titlelabel setBackgroundColor:[UIColor clearColor]];
    [titlelabel sizeToFit];
    [view addSubview:titlelabel];

    datelabel=[[UILabel alloc]initWithFrame:CGRectMake(10, 62, 190, 20)];
    [datelabel setText:[[[[[[dataDict objectForKey:@"rss"]objectForKey:@"channel"]objectForKey:@"item"]objectAtIndex:i]objectForKey:@"title"]objectForKey:@"text"]];
    [datelabel setNumberOfLines:0];
    datelabel.font=[UIFont fontWithName:@"arial" size:12.0f];
    [datelabel setBackgroundColor:[UIColor clearColor]];
    [datelabel sizeToFit];
    [view addSubview:datelabel];

    NSData *data=[[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:[[[[[[[dataDict objectForKey:@"rss"]objectForKey:@"channel"]objectForKey:@"item"]objectAtIndex:i]objectForKey:@"image"]objectForKey:@"text"]stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]]];
    NSLog(@"data= %@",data);
    if (data==NULL ||[[[[[[[dataDict objectForKey:@"rss"]objectForKey:@"channel"]objectForKey:@"item"]objectAtIndex:i]objectForKey:@"image"]objectForKey:@"text"] isEqualToString:@""])
    {
        textview=[[UITextView alloc]initWithFrame:CGRectMake(2,80, 238, 386)];
        [textview setText:[[[[[[dataDict objectForKey:@"rss"]objectForKey:@"channel"]objectForKey:@"item"]objectAtIndex:i]objectForKey:@"title"]objectForKey:@"text"]];
        [textview setFont:[UIFont fontWithName:@"ArialMT" size:14]];
        [textview setDelegate:self];
        [view addSubview:textview];
    }
    else
    {
        imageview=[[UIImageView alloc]initWithFrame:CGRectMake(7, 80, 230, 150)];
        [imageview setImage:[UIImage imageWithData:data]];
        [view addSubview:imageview];

        textview=[[UITextView alloc]initWithFrame:CGRectMake(5, 240, 238, 200)];
        [textview setText:[[[[[[dataDict objectForKey:@"rss"]objectForKey:@"channel"]objectForKey:@"item"]objectAtIndex:i]objectForKey:@"title"]objectForKey:@"text"]];
        [textview setFont:[UIFont fontWithName:@"ArialMT" size:14]];
        [textview setDelegate:self];
        [view addSubview:textview];
    }

}

here wat make me problem is the image which gets from server every time so this gets slower, pls suggest how to make it do as lazy loading ....

thanks in advance


回答1:


UICollectionView should be a better choice to display that kind of data in my opinion, but it's not compatible with ios5.

If you need an ios 5 compatibility, check out that answer: https://stackoverflow.com/a/16039194/2707614

Finally, to respond to your question, you can try to use Grand Central Dispatch as explained here

It should look like that (I don't have a computer to test):

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);

 dispatch_async(queue, ^{
for (int i=3; i<[[[self rssParser]rssItems]count]; i++)
    // for (int i=3; i<[titlearray count]; i++)
{
    if (i%3==0)
    {
        x=0;
        y++;
    }

    view=[[UIView alloc]initWithFrame:CGRectMake((x*250)+10, (y*306)+105, 244, 300)];
    [view setBackgroundColor:[UIColor whiteColor]];
    view.layer.borderColor=[[UIColor whiteColor]CGColor];
    view.layer.borderWidth=1.0;
    view.layer.cornerRadius = 5;
    view.layer.masksToBounds = YES;



    titlelabel=[[UILabel alloc]initWithFrame:CGRectMake(10, 10, 230, 20)];
    [titlelabel setText:[[[[self rssParser]rssItems]objectAtIndex:i-1]title]];
    [titlelabel setNumberOfLines:0];
    titlelabel.font=[UIFont boldSystemFontOfSize:14.0f];

    [titlelabel setBackgroundColor:[UIColor clearColor]];
    [titlelabel sizeToFit];


    datelabel=[[UILabel alloc]initWithFrame:CGRectMake(10, 62, 190, 20)];
    [datelabel setText:[[[[self rssParser]rssItems]objectAtIndex:i-1]pubDate]];
    [datelabel setNumberOfLines:0];
    datelabel.font=[UIFont fontWithName:@"arial" size:10.0f];
    [datelabel setBackgroundColor:[UIColor clearColor]];
    [datelabel sizeToFit];

    x++;

    dispatch_sync(dispatch_get_main_queue(), ^{
        [scroller addSubview:view];
        [view addSubview:titlelabel];
        [view addSubview:datelabel];
    });

}
});


来源:https://stackoverflow.com/questions/18461699/asynchronus-for-loop-in-iphone

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!