2014-09-25 3 views
-1

Я использовал этот ответ сортировки 2 объектов по дате, и работал отлично: Get one NSArrayСортировка массива объектов по дате в TableView

теперь мне нужен рода 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]; 
    }]; 
} 
+0

Старый метод должен работать независимо от количества элементов в массиве. При сортировке массива компаратор всегда принимает два параметра. Задача состоит в том, чтобы делать попарное сравнение любых двух элементов. Метод сортировки SDK, который его вызывает, заботится о создании всех правильных парных комбинаций. Если он не работает с существующим (2 param) методом, то есть и другая проблема. – danh

+0

Его работа отлично с методом 2 param, который вы отправили в исходном вопросе (метод, который я опубликовал, который говорит: «Вот, какая сортировка двух дат выглядела как раньше») – Realinstomp

+0

То, что я не могу получить, является первой частью код, который я перечислил в этом вопросе в разделе «Вот что я пробовал:», который использует 3 параметра. Как вы можете видеть, я добавил 'dateC'. – Realinstomp

ответ

1

Компаратор должен всегда брать два значения для сравнения, но он хочет проверить, являются ли эти два значения одним из трех типов. Добавьте следующее в открытые интерфейсы, определенные в FeedRSS.h, Data.h и YaRSS.h:

- (NSDate *)sortDate; 

В каждой из реализаций, добавить метод, который возвращает право собственности даты для сортировки для класса, так, например,

// FeedRSS.m 
- (NSDate *)sortDate { 
    return self.pubDate; 
} 

Та же самая идея для Data.m (возвращение 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]; 
    }]; 
} 

Это работает, если массив содержит только три вида объектов, которые вы ожидаете. Если вы всегда хотите сортировать этот путь, более простой подход - реализовать сравнение: в каждом из этих классов, в каждом из которых проверяется, является ли параметр одним из двух других типов.

+0

Это имеет смысл. Попытайтесь сейчас! – Realinstomp

+0

Отлично работает! Кроме того, что они сортируют их по последней дате, а не самой последней дате. Мне нужно просто изменить последнюю строку 'return [dateA compare: dateB];' to 'return [dateB compare: dateA];'? – Realinstomp

+0

Да, просто поменяйте заказ – danh

Смежные вопросы