Search code examples
iosxcoderssios6nsattributedstring

iOS getting date string from RSS Feed


I have an XML parser that uses RaptureXML to grab each item and display it within a table cell. I already can get the title and description, but I can't seem to work out how to get the date.

Here's what I have so far for the date:

NSString* dateString;

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"EEEE MMMM d, YYYY"];
dateString = [formatter stringFromDate:self.pubDate];


[articleAbstract appendAttributedString:
 [[NSAttributedString alloc] initWithString: dateString]
 ];

I keep getting this showing up in the debugger:

'NSInvalidArgumentException', reason: 'NSConcreteAttributedString initWithString:: nil value'

I don't know what I'm doing wrong. Here's the full code:

RSSItem.h

#import <Foundation/Foundation.h>

@interface RSSItem : NSObject

@property (strong, nonatomic) NSString* title;
@property (strong, nonatomic) NSString* description;
@property (strong, nonatomic) NSURL* link;
@property (strong, nonatomic) NSAttributedString* cellMessage;
@property (strong, nonatomic) NSDate* pubDate;
@property (strong, nonatomic) NSString* dateString;

@end

RSSItem.m

#import "RSSItem.h"
#import "GTMNSString+HTML.h"

@implementation RSSItem

-(NSAttributedString*)cellMessage

{ if (_cellMessage!=nil) return _cellMessage;

NSDictionary* boldStyle = @{NSFontAttributeName: [UIFont fontWithName:@"Helvetica-Bold" size:16.0]};
NSDictionary* normalStyle = @{NSFontAttributeName: [UIFont fontWithName:@"Helvetica" size:16.0]};

NSMutableAttributedString* articleAbstract = [[NSMutableAttributedString alloc] initWithString:self.title];

[articleAbstract setAttributes:boldStyle
                         range:NSMakeRange(0, self.title.length)];


[articleAbstract appendAttributedString:
 [[NSAttributedString alloc] initWithString:@"\n\n"]
 ];

// Parse for date

NSString* dateString;

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"EEEE MMMM d, YYYY"];
dateString = [formatter stringFromDate:self.pubDate];


[articleAbstract appendAttributedString:
 [[NSAttributedString alloc] initWithString: dateString]
 ];

[articleAbstract appendAttributedString:
 [[NSAttributedString alloc] initWithString:@"\n\n"]
 ];

int startIndex = [articleAbstract length];

NSString* description = [NSString stringWithFormat:@"%@...", [self.description substringToIndex:100]];
description = [description gtm_stringByUnescapingFromHTML];

[articleAbstract appendAttributedString:
 [[NSAttributedString alloc] initWithString: description]
 ];

[articleAbstract setAttributes:normalStyle
                         range:NSMakeRange(startIndex, articleAbstract.length - startIndex)];

_cellMessage = articleAbstract;
return _cellMessage;

}

@end

EDIT: Here is my RSS Loader

#import "RSSItem.h"

#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

@implementation RSSLoader

-(void)fetchRssWithURL:(NSURL*)url complete:(RSSLoaderCompleteBlock)c
{
dispatch_async(kBgQueue, ^{

    //work in the background
    RXMLElement *rss = [RXMLElement elementFromURL: url];
    RXMLElement* title = [[rss child:@"channel"] child:@"title"];        
    RXMLElement* pubDate = [[rss child:@"channel"] child:@"pubDate"];

    NSString *usableDate = [pubDate];       

    NSArray* items = [[rss child:@"channel"] children:@"item"];

    NSMutableArray* result = [NSMutableArray arrayWithCapacity:items.count];

    //more code
    for (RXMLElement *e in items) {

        //iterate over the articles
        RSSItem* item = [[RSSItem alloc] init];
        item.title = [[e child:@"title"] text];            
        item.pubDate = usableDate
        item.description = [[e child:@"description"] text];
        item.link = [NSURL URLWithString: [[e child:@"link"] text]];
        [result addObject: item];
    }

    c([title text], result);
});

}

Can someone please help me parse my date correctly?


Solution

  • Based on the code you added to your question, the problem has to do with how you set the pubDate property. You defined the property to be an NSDate but you set an NSString value to the property in your RSS loader code.

    You need to convert the string obtained from the XML file to an NSDate or change your pubDate property from NSDate to NSString. If you do the latter then your earlier code needs to be updated to reflect this change.

    The decision is really dependent on what you need to do with the date.