0

私はいくつかのブログアプリを持っています。最近、一部の問題が発生し始めました。ASIHTTP クラスと GDataXML クラスを使用して wordpress フィードの xml を解析し、各項目 (記事) を変更可能な配列に入れます。次に、テーブルビューはすべてのストーリーを各記事のセルにロードすることになっています。私が抱えている問題は、最初の実行時に新しい記事が表示されず、ユーザーがプルして更新する必要があり、その後新しい記事が表示されることです。今アプリでテストを実行しました。記事は数時間前に投稿されました。アプリを実行しましたが、そこにはありませんでした。引っ張ってリフレッシュすると、表示されました。アプリを完全に閉じて再起動すると、また消えました。TableView の実装のコードは次のとおりです。

@implementation RootViewController


- (void)refresh {
    self.allEntries = [NSMutableArray array];
    self.queue = [[[NSOperationQueue alloc] init] autorelease];
    self.feeds = [NSArray arrayWithObjects:@"http://bubblycandacebabbles.wordpress.com/?cat=-2008&feed=rss2",
                  nil];


    for (NSString *feed in _feeds) {
        NSURL *url = [NSURL URLWithString:feed];
        ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
        [request setDelegate:self];
        [_queue addOperation:request];
    }

}

- (void)viewDidLoad {
    [super viewDidLoad];    
    [activity startAnimating];
    //[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"navbarcopy.png"] forBarMetrics:UIBarMetricsDefault];
    self.title = @"Blog";
        CGFloat nRed=111.0/255.0;
    CGFloat nBlue=209/255.0;
    CGFloat nGreen=229.0/255.0;
    UIColor *myColor=[[UIColor alloc]initWithRed:nRed green:nBlue blue:nGreen alpha:1];
    UIBarButtonItem *font = [[UIBarButtonItem alloc] initWithTitle:@"Change Font Size" style:UIBarButtonItemStylePlain target:self action:@selector(fontsizes)];
    self.navigationController.navigationItem.rightBarButtonItem = font;
    self.tableView.backgroundColor = myColor;

    self.refreshControl = [[UIRefreshControl alloc] init];

    [self.refreshControl addTarget:self action:@selector(refreshInvoked:forState:) forControlEvents:UIControlEventValueChanged];
    [self refresh];
}
-(void) refreshInvoked:(id)sender forState:(UIControlState)state {
    // Refresh table here...
    [_allEntries removeAllObjects];
    [self.tableView reloadData];
    [self refresh];
}

- (void)parseRss:(GDataXMLElement *)rootElement entries:(NSMutableArray *)entries {

    NSArray *channels = [rootElement elementsForName:@"channel"];
    for (GDataXMLElement *channel in channels) {            

        NSString *blogTitle = [channel valueForChild:@"title"];                    

        NSArray *items = [channel elementsForName:@"item"];
        for (GDataXMLElement *item in items) {

            NSString *articleTitle = [item valueForChild:@"title"];
            NSString *articleUrl = [item valueForChild:@"link"];            
            NSString *articleDateString = [item valueForChild:@"pubDate"];        
            NSDate *articleDate = [NSDate dateFromInternetDateTimeString:articleDateString formatHint:DateFormatHintRFC822];
            NSString *articleImage = [item valueForChild:@"content:encoded"];
            NSScanner *theScanner;
            NSString *gt =nil;
            theScanner = [NSScanner scannerWithString:articleImage];


            NSString *comments = [articleUrl stringByAppendingString:@"#respond"];
            NSString *commentslink = [NSString stringWithFormat: @"<a href=\"%@\">Leave A Comment</a>",comments];
            // find start of tag
            [theScanner scanUpToString:@"alt=\"\" width=" intoString:NULL] ; 

            // find end of tag
            [theScanner scanUpToString:@"/>" intoString:&gt] ;
            // replace the found tag with a space
            //(you can filter multi-spaces out later if you wish)
            NSString *test = [articleImage stringByReplacingOccurrencesOfString:[ NSString stringWithFormat:@"%@", gt] withString:@"alt=\"\" width=\"150\" height=\"150\""];
            NSString *final = [test stringByReplacingOccurrencesOfString:@"float:none;height:30px" withString:@"float:none;height:1px"]; 
            NSDateFormatter * dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
            [dateFormatter setTimeStyle:NSDateFormatterShortStyle];
            [dateFormatter setDateStyle:NSDateFormatterShortStyle];
            NSString *dateofarticle = [dateFormatter stringFromDate:articleDate];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
            NSString *smalltitle = [defaults objectForKey:@"Title"];
            NSString *smallbody = [defaults objectForKey:@"Article"];
            NSString *bodyoftext = [[[[[[[[[[[@"<head><body bgcolor=\"#6fd1e5\" text=\"#CC0099\"><style type='text/css'>a > img {pointer-events: none;cursor: default;max-width: 310;}</style></head><b><font size=" stringByAppendingString: smalltitle ] stringByAppendingString:@"><div align=\"left\"><FONT FACE=\"noteworthy\">" ]stringByAppendingString:articleTitle] stringByAppendingString:@"</font></b><font size=" ] stringByAppendingString:smallbody ] stringByAppendingString:@"><div align=\"left\"><FONT FACE=\"noteworthy\">"] stringByAppendingString:dateofarticle] stringByAppendingString:@"</div></p><FONT FACE=\"noteworthy\">"] stringByAppendingString:final] stringByAppendingString:commentslink]stringByAppendingString:@"</FONT>"];








            RSSEntry *entry = [[[RSSEntry alloc] initWithBlogTitle:blogTitle
                                                      articleTitle:articleTitle
                                                        articleUrl:articleUrl
                                                       articleDate:articleDate
                                                      articleImage:bodyoftext] autorelease];
            [entries addObject:entry];
        }      
    }

}


- (void)parseFeed:(GDataXMLElement *)rootElement entries:(NSMutableArray *)entries {

    if ([rootElement.name compare:@"rss"] == NSOrderedSame) {
        [self parseRss:rootElement entries:entries];
    } else if ([rootElement.name compare:@"feed"] == NSOrderedSame) {                       
        [self parseAtom:rootElement entries:entries];
    } else {
        NSLog(@"Unsupported root element: %@", rootElement.name);
    }    
}


// Customize the number of sections in the table view.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}


// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [_allEntries count];
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";  

    Cell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {  
        cell = [[Cell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }



    RSSEntry *entry = [_allEntries objectAtIndex:indexPath.row];
    NSString *substring = @"http://bubblycandacebabbles.files.wordpress.com";
    NSRange textRange = [entry.articleImage rangeOfString:substring];

   if(textRange.location != NSNotFound){
        NSString *thearticleImage = entry.articleImage;
        NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:@"src=\"([^\"]+)\"" options:NSRegularExpressionCaseInsensitive error:NULL];
        NSString *someString = thearticleImage;
        NSString *oneurl = [someString substringWithRange:[expression rangeOfFirstMatchInString:someString options:NSMatchingCompleted range:NSMakeRange(0, [someString length])]];
       NSString *finalstring = [oneurl stringByReplacingOccurrencesOfString:@"src=\"" withString:@""];
       NSString *thefinalstring = [finalstring stringByReplacingOccurrencesOfString:@"\"" withString:@""];
        NSDateFormatter * dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
        [dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
        [dateFormatter setTimeStyle:NSDateFormatterShortStyle];
        [dateFormatter setDateStyle:NSDateFormatterShortStyle];
       CGFloat nRed=204.0/255.0;
       CGFloat nBlue=0/255.0;
       CGFloat nGreen=153.0/255.0;
       UIColor *myColortext=[[UIColor alloc]initWithRed:nRed green:nBlue blue:nGreen alpha:1];
        NSString *articleDateString = [dateFormatter stringFromDate:entry.articleDate];
        UIFont *cellFont = [UIFont fontWithName:@"noteworthy" size:16];
        UIFont *cellFont2 = [UIFont fontWithName:@"noteworthy" size:12];    
        CALayer * l = [cell.imageView layer];
        [l setMasksToBounds:YES];
        [l setCornerRadius:11];
        [l setBorderWidth:2.0];
        [l setBorderColor:[[UIColor blackColor] CGColor]];
        cell.textLabel.text = entry.articleTitle;
       cell.textLabel.numberOfLines = 2;
       cell.detailTextLabel.adjustsFontSizeToFitWidth = YES;

        cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ - Mother May I Blog", articleDateString];

        cell.textLabel.font = cellFont;
        cell.detailTextLabel.font = cellFont2;
       cell.textLabel.textColor = myColortext;
       cell.detailTextLabel.textColor = myColortext;
        [cell.imageView setImageWithURL:[NSURL URLWithString:thefinalstring] placeholderImage:[UIImage imageNamed:@"iphoneicon@2x.png"]];


    }
   else    {
        CALayer * l = [cell.imageView layer];
        [l setMasksToBounds:YES];
        [l setCornerRadius:11];
        [l setBorderWidth:2.0];
        [l setBorderColor:[[UIColor blackColor] CGColor]];
        NSDateFormatter * dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
        [dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
        [dateFormatter setTimeStyle:NSDateFormatterShortStyle];
        [dateFormatter setDateStyle:NSDateFormatterShortStyle];
        NSString *articleDateString = [dateFormatter stringFromDate:entry.articleDate];
        UIFont *cellFont = [UIFont fontWithName:@"noteworthy" size:16];    
        UIFont *cellFont2 = [UIFont fontWithName:@"noteworthy" size:12];    
        cell.imageView.image = [UIImage imageNamed:@"iphoneicon@2x.png"];
        cell.textLabel.text = entry.articleTitle;
       cell.textLabel.numberOfLines = 2;
       cell.detailTextLabel.adjustsFontSizeToFitWidth = YES;

        cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ - Mother May I Blog", articleDateString];
       CGFloat nRed=204.0/255.0;
       CGFloat nBlue=0/255.0;
       CGFloat nGreen=153.0/255.0;
       UIColor *myColortext=[[UIColor alloc]initWithRed:nRed green:nBlue blue:nGreen alpha:1];
        cell.textLabel.font = cellFont;
        cell.detailTextLabel.font = cellFont2;
       cell.textLabel.textColor = myColortext;
       cell.detailTextLabel.textColor = myColortext;


    }


    return cell;
}
4

1 に答える 1

0

呼び出す必要があります

[self.tableView reloadData];

データのロードが完了した後のある時点で。これをどのように正確に行うかは少しトリッキーです。操作キューが空になったことを伝える何らかの方法が必要です。または、理論的には、キュー内の各操作が完了した後に呼び出すこともできます。これにより、テーブルが一度に 1 つずつ読み込まれます。これは、ユーザーの接続が遅い場合に問題を引き起こす可能性があります。テーブルをリロードするとユーザー エクスペリエンスが急激に変化する可能性があるためです。またreloadData、別のスレッドからの呼び出しのスレッド セーフについては肯定的ではありません。

于 2012-12-05T14:15:49.793 に答える