2013-08-27 1 views
0

цикл for выглядит так, что я написал на виду, загрузился, поэтому загрузка этой страницы занимает больше времени.Asynchronus for loop in iphone

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

}

здесь Ват сделать меня проблемой является изображение, которое получает от сервера каждый раз, так что это становится медленнее, пожалуйста подсказывают, как сделать это делать, как отложенной загрузки ....

спасибо заблаговременно

+0

Сколько предметов обычно будет в rssItems, примерно? – James

+0

http://stackoverflow.com/a/11728134/1059705 и этот http://jeffreysambells.com/2013/03/01/asynchronous-operations-in-ios-with-grand-central-dispatch – Bala

+0

@James его динамический , это может быть sumtime 10 sumtime 50 также ... – KSR

ответ

0

UICollectionView должен быть лучшим выбором для отображения таких данных, на мой взгляд, , но он несовместим с ios5.

Если вам нужна совместимость ИОС 5, проверить, что ответ: https://stackoverflow.com/a/16039194/2707614

Наконец, чтобы ответить на ваш вопрос, вы можете попробовать использовать Grand Central Dispatch , как описано here

Он должен выглядеть, что (У меня нет компьютера для тестирования):

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

} 
}); 
+0

Вы не должны обманывать объекты UI из фоновых очередей. Это * обычно * включает их создание (если это не изменилось в недавнем выпуске). Также обратите внимание, что при этом предполагается, что 'rssParser' и т. Д. Все потокобезопасны ... – bbum

+0

Я использовал для создания ui-объектов в фоновом порядке и вызывал« связанные с отображением »методы в основном потоке без проблем, Мне интересно знать, почему плохо создавать объекты. – Alban

+0

Из документации: *** Примечание: ** По большей части классы UIKit должны использоваться только из основного потока приложения. Это особенно справедливо для классов, полученных из UIResponder, или которые связаны с управлением пользовательским интерфейсом вашего приложения. * I.e. он работает только по совпадению. – bbum