我用这个答案按日期对2个对象进行排序,效果非常好:获得一个NSArray
我现在需要按日期对3个对象进行排序,而无法完全修改我必须做的事情,才能做到这一点。
API/RSS提要中的所有文章将按日期在1 tableView
中排序
以下是我尝试过的:
- (void)sortCombinedModel {
// All 3
[self.combinedModel sortUsingComparator:^NSComparisonResult(id a, id b, id c) {
NSDate *dateA, *dateB, *dateC;
dateA = ([a isKindOfClass:[FeedRSS self]])? ((FeedRSS *)a).pubDate : ((Data *)a).created_time : ((YaRSS *)a).pubDate;
dateB = ([b isKindOfClass:[FeedRSS self]])? ((FeedRSS *)b).pubDate : ((Data *)b).created_time : ((YaRSS *)b).pubDate;
dateC = ([c isKindOfClass:[FeedRSS self]])? ((FeedRSS *)c).pubDate : ((Data *)c).created_time : ((YaRSS *)c).pubDate;
return [dateB compare:dateA compare:dateC];
}];
}
你能帮我把3个日期排序吗
如果需要,请提供其他信息:
我发现了如何修改这个部分-有3个API/RSS提要进入一个NSMutableArray
:
- (void)loadMedia {
self.combinedModel = [NSMutableArray array];
// Here's the #1
[self loadOneWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
[self.combinedModel addObjectsFromArray:mappingResult.array];
// Here's the trick. call API2 here. Doing so will serialize these two requests
[self loadTwoWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
[self.combinedModel addObjectsFromArray:mappingResult.array];
// Here's the trick. call API3 here. Doing so will serialize these two requests
[self loadThreeWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
[self.combinedModel addObjectsFromArray:mappingResult.array];
[self sortCombinedModel];
[self.tableView reloadData];
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
NSLog(@"No?: %@", error);
}];
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
NSLog(@"No?: %@", error);
}];
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
NSLog(@"No?: %@", error);
}];
}
以下是以前排序2个日期的情况:
- (void)sortCombinedModel {
[self.combinedModel sortUsingComparator:^NSComparisonResult(id a, id b) {
NSDate *dateA, *dateB;
dateA = ([a isKindOfClass:[Feed self]])? ((Feed *)a).published : ((Data *)a).created_time;
dateB = ([b isKindOfClass:[Feed self]])? ((Feed *)b).published : ((Data *)b).created_time;
return [dateA compare:dateB];
}];
}
比较器必须始终取两个值进行比较,但它希望检查这两个值是否为三种类型之一。将以下内容添加到FeedRSS.h、Data.h和YaRSS.h中定义的公共接口:
- (NSDate *)sortDate;
在每个实现中,添加一个返回正确日期属性的方法来对类进行排序,例如
// FeedRSS.m
- (NSDate *)sortDate {
return self.pubDate;
}
Data.m(return self.created_time)和YaRSS.h的想法相同,返回对象要排序的任何日期
- (void)sortCombinedModel {
[self.combinedModel sortUsingComparator:^NSComparisonResult(id a, id b) {
NSDate *dateA = nil, *dateB = nil;
if ([a isKindOfClass:[Feed self]]) { dateA = ((Feed *)a).sortDate; }
else if ([a isKindOfClass:[Data self]]) { dateA = ((Data *)a).sortDate; }
else if ([a isKindOfClass:[YaRSS self]]) { dateA = ((YaRSS *)a).sortDate; }
if ([b isKindOfClass:[Feed self]]) { dateB = ((Feed *)b).sortDate; }
else if ([b isKindOfClass:[Data self]]) { dateB = ((Data *)b).sortDate; }
else if ([b isKindOfClass:[YaRSS self]]) { dateB = ((YaRSS *)b).sortDate; }
return [dateA compare:dateB];
}];
}
如果数组只包含所需的三种对象,则此操作有效。如果你总是想这样排序,一个更整洁的方法是实现compare:在这些类中的每一个中,在每个类中检查param是否是其他两种类型中的一种。