【问题标题】:Adding items to NSMutableArray based off of NSDate in iOS在 iOS 中基于 NSDate 向 NSMutableArray 添加项目
【发布时间】:2014-05-09 03:47:09
【问题描述】:

在我的 iOS 原生应用程序中,我解析一个 XML 文件,使用一个名为 RSSEntry 的类解析所有内容。它从 pubDate 获取日期并将其存储为 articleDate,一个 NSDate。解析完所有内容后,运行以下代码:

- (void)requestFinished:(ASIHTTPRequest *)request {

    [_queue addOperationWithBlock:^{

        NSError *error;
        GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:[request responseData]
                                                               options:0 error:&error];
        if (doc == nil) {
            NSLog(@"Failed to parse %@", request.url);
        } else {

            NSMutableArray *entries = [NSMutableArray array];
            [self parseFeed:doc.rootElement entries:entries];

            [[NSOperationQueue mainQueue] addOperationWithBlock:^{

                for (RSSEntry *entry in entries) {

                    int insertIdx = [_allEntries indexForInsertingObject:entry sortedUsingBlock:^(id a, id b) {
                        RSSEntry *entry1 = (RSSEntry *) a;
                        RSSEntry *entry2 = (RSSEntry *) b;
                        return [entry1.articleDate compare:entry2.articleDate];
                    }];

                    [_allEntries insertObject:entry atIndex:insertIdx];
                    [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:insertIdx inSection:0]]
                                          withRowAnimation:UITableViewRowAnimationRight];

                }

            }];

        }
    }];
    [self.refreshControl endRefreshing];

}

这会将每个条目添加到 UITableView,按日期排序。但是,有些日期将在未来。我只想添加当天或更早的 pubDate 条目,消除未来的条目,直到它们的日期临近。建议?

【问题讨论】:

    标签: ios uitableview nsmutablearray nsdate


    【解决方案1】:

    在你的类中添加这个方法

    - (BOOL)isDate:(NSDate *)startDate earlierThanDate:(NSDate *)endDate
    {
        if ([startDate compare:endDate] == NSOrderedAscending) {
            return YES;
        } else if ([startDate compare:endDate] == NSOrderedSame) {
            return YES;
        } else {
            return NO;
        }
    
    }
    

    然后在将对象添加到数组之前,使用此方法检查它是否是未来日期

    - (void)requestFinished:(ASIHTTPRequest *)request {
    
        [_queue addOperationWithBlock:^{
    
            NSError *error;
            GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:[request responseData]
                                                                   options:0 error:&error];
            if (doc == nil) {
                NSLog(@"Failed to parse %@", request.url);
            } else {
    
                NSMutableArray *entries = [NSMutableArray array];
                [self parseFeed:doc.rootElement entries:entries];
    
                [[NSOperationQueue mainQueue] addOperationWithBlock:^{
    
                    for (RSSEntry *entry in entries) {
                        if ([self isDate:[NSDate date] earlierThanDate:entry.articleDate])  {
    
                            int insertIdx = [_allEntries indexForInsertingObject:entry sortedUsingBlock:^(id a, id b) {
                               RSSEntry *entry1 = (RSSEntry *) a;
                               RSSEntry *entry2 = (RSSEntry *) b;
                               return [entry1.articleDate compare:entry2.articleDate];
                            }];
    
                              [_allEntries insertObject:entry atIndex:insertIdx];
                              [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:insertIdx inSection:0]]
                                              withRowAnimation:UITableViewRowAnimationRight];
    
                        }
    
    
    
                    }
    
                }];
    
            }
        }];
        [self.refreshControl endRefreshing];
    
    }
    

    【讨论】:

      【解决方案2】:

      我想到了几个想法:

      • 当您解析 xml 时,如果日期是未来,请不要将对象添加到最终数组中。

      • 我假设您的 numberOfRowsInSection 方法正在返回数组中的元素数。如果是这种情况,则找到日期在未来的第一个项目的索引,然后返回小于该日期的 1。这应该可以工作,因为您的数组已排序。这样做的好处是可以轻松重新加载 tableview,并且无需额外工作即可显示之前未进行剪切的行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-17
        • 2011-10-30
        • 2011-12-03
        相关资源
        最近更新 更多