2016-07-25 41 views
0

的核心數據對象的數組我有有一個時間(日期)屬性核心數據對象的數組。Subdividng由屬性

我想要做的是將所有具有相同時間的核心數據對象放入單獨的數組中,然後創建這些數組的數組。如果沒有其他對象具有相同的時間,那麼該對象本身將在數組中。

即如果芯的數據對象的陣列有3個對象與時間08:00,並用時間屬性09:00然後我想創建一個陣列與所述第一3個對象(時間08:00)和一個獨立的1個對象排列最後一個對象(時間09:00)。然後我想創建一個應該很容易的數組。 Start: [8,8,8,9] Finish: [[8,8,8][9]]

我很努力地研究如何迭代我的原始數組,然後將所有對象拉出同一時間,然後將這些對象放入它們自己的數組中。

回答

0

一個了許多辦法這是否使用一個NSDictionary對象,其中時間是關鍵和t他相應的對象是具有這個時間的核心數據對象的數組。核心數據對象迭代一次。

NSArray *data = core data objects 
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary]; 
for (ManagedObjectClass *object in data) { 
    NSDate *time = object.time; 
    // convert time to time without date 
    NSMutableArray *array = dictionary[time]; 
    if (!array) { 
     array = [NSMutableArray array]; 
     dictionary[time] = array; 
    } 
    [array addObject:object]; 
} 
NSArray *array = dictionary.allValues; 

另一種方式來做到這一點,如果時間不需要轉換:通過時間的核心數據對象進行排序,迭代的對象,開始一個新的子數組時,時間的變化和對象添加到子陣列。

NSArray *data = core data objects 
NSArray *sortedData = [data sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"time" ascending:YES]]]; 
NSMutableArray *array = [NSMutableArray array]; 
NSMutableArray *subarray = nil; 
NSDate *prevTime = nil; 
for (ManagedObjectClass *object in sortedData) { 
    NSDate *time = object.time; 
    if (![time isEqualToDate:prevTime]) { 
     subarray = [NSMutableArray array]; 
     [array addObject:subarray]; 
    } 
    [subarray addObject:object]; 
    prevTime = time; 
} 
0

你可以做一些這樣的事:

  • 添加一個短暫的財產在你coredata對象。
  • 在瞬態屬性中消除日期中的分鐘和秒鐘。
  • 根據您的瞬態特性不同的對象。
  • 從主數組中過濾對象,並將它們添加到單獨的數組中。
  • 最後將它們添加到最終數組中。

實現可以是這樣的:

MyObject *myObject1 = [[MyObject alloc] initWithDate:[NSDate dateWithTimeIntervalSinceNow:10*60]]; 
    MyObject *myObject2 = [[MyObject alloc] initWithDate:[NSDate dateWithTimeIntervalSinceNow:10*60]]; 
    MyObject *myObject3 = [[MyObject alloc] initWithDate:[NSDate dateWithTimeIntervalSinceNow:180*60]]; 
    MyObject *myObject4 = [[MyObject alloc] initWithDate:[NSDate dateWithTimeIntervalSinceNow:120*60]]; 
    MyObject *myObject5 = [[MyObject alloc] initWithDate:[NSDate dateWithTimeIntervalSinceNow:120*60]]; 

    NSMutableArray *myObjects = [NSMutableArray arrayWithObjects:myObject1,myObject2,myObject3,myObject4,myObject5, nil]; 
    NSArray *distinctObjects = [myObjects valueForKeyPath:@"@distinctUnionOfObjects.transientDate"]; 
    NSMutableArray *finalArray = [NSMutableArray array]; 

    for(NSDate *aDate in distinctObjects) { 
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"transientDate == %@", aDate]; 
     NSArray *filteredArray = [myObjects filteredArrayUsingPredicate:predicate]; 
     [finalArray addObject:filteredArray]; 
    } 

    NSLog(@"distintobjects: %@", finalArray); 

這裏是如何MyObject樣子:

#import <Foundation/Foundation.h> 

@interface MyObject : NSObject 
{ 

} 
@property(nonatomic, strong) NSDate *myDate; 

@property(nonatomic, strong) NSDate *transientDate; 

- (id)initWithDate:(NSDate *)aDate; 
@end 
#import "MyObject.h" 

@implementation MyObject 

- (id)initWithDate:(NSDate *)aDate { 
    self = [super init]; 

    self.myDate = aDate; 

    return self; 
} 

- (NSDate *)transientDate { 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"dd-MM-yyyy HH"]; 
    return [dateFormatter dateFromString:[dateFormatter stringFromDate:self.myDate]]; 
} 

- (NSString *)description 
{ 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"dd-MM-yyyy HH:mm"]; 
    return [NSString stringWithFormat:@"transientDate: %@", [dateFormatter stringFromDate:self.transientDate]]; 
} 
@end 

下面是最終輸出: enter image description here