2014-04-07 2 views
0

객체가있는 배열이 있고, 각 객체는 "날짜"라는 속성을 보유하고 있습니다. 배열을 골라서 현재 날짜와 가장 가까운 날짜를 가진 객체를 찾고 싶습니다.가장 가까운 날짜로 가장 가까운 날짜의 배열 안에 객체를 반환하는 중

#import <Foundation/Foundation.h> 

@interface FixturesObject : NSObject 
@property (nonatomic, strong) NSString *homeGoals; 
@property (nonatomic, strong) NSString *awayGoals; 
@property (nonatomic, strong) NSString *homeName; 
@property (nonatomic, strong) NSString *awayName; 
@property (nonatomic, strong) NSString *round; 
@property (strong, nonatomic) UIImage *homeLogo; 
@property (strong, nonatomic) UIImage *awayLogo; 
@property (nonatomic, strong) NSString *date; 
@property (nonatomic, strong) NSDate *date2; 
@property (nonatomic, strong) NSNumber *epoch; 


+(FixturesObject *)fixtureFromXMLDictionary: (NSDictionary *)dict; 

@end 

#import "FixturesObject.h" 

@implementation FixturesObject 
@synthesize homeGoals, awayGoals, homeLogo, awayLogo, homeName, awayName, round, date, epoch, date2; 


+(FixturesObject *)fixtureFromXMLDictionary:(NSDictionary *)dict{ 

    FixturesObject *object =[[FixturesObject alloc]init]; 

    object.homeGoals = dict[@"HomeGoals"]; 
    object.awayGoals = dict[@"AwayGoals"]; 
    object.homeName = dict[@"HomeTeam"]; 
    object.awayName = dict[@"AwayTeam"]; 
    object.homeLogo = [UIImage imageNamed:dict[@"HomeTeam_Id"]];; 
    object.awayLogo = [UIImage imageNamed:dict[@"AwayTeam_Id"]]; 
    object.round = dict[@"Round"]; 
    object.date = dict[@"Date"]; 

    NSString * dateString = [NSString stringWithFormat: @"%@",object.date]; 
    NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; 
    NSDate* myDate = [dateFormatter dateFromString:dateString]; 

    object.date2 = myDate; 
    return object; 

} 

@end 

mainview.m

FixturesObject *closestObject; 
NSTimeInterval closestInterval = DBL_MAX; 

for (FixturesObject *myObject in newFixtureObjectArray) { 
    NSTimeInterval interval = ABS([myObject.date2 timeIntervalSinceDate:[NSDate date]]); 
    if (interval < closestInterval) { 
     closestInterval = interval; 
     closestObject = myObject; 
       NSLog(@"My closest date: %@", myObject); 
    } 
} 

의 요청에 따라, 당신에게 당신의 도움을 너무 많이들 감사합니다 업데이트!

+1

'myObject.date'가 NSString의 인스턴스 인 것처럼 보이기 때문에 FixturesObject에 대한 공용 인터페이스를 볼 수 있습니까? – FluffulousChimp

+0

그것은 NSString의 인스턴스입니다 – user3504848

+0

NSDate로 두 번째 속성을 만들었습니다. 오류가 사라졌지 만 지금은이 오류와 충돌합니다 : - [NSNull date2] : 인식 할 수없는 선택자가이 줄에 0x102f20b50 인스턴스로 전송 됨 : if (interval < closest2) { – user3504848

답변

0

myObject.date가 NSDate 클래스의 개체인지 확인해야합니다. 다른 유형의 객체 인 경우 작동하지 않습니다. myObject.date가 nil이면 제대로 작동하지 않습니다.

보고하려는 새 오류 ([NSNull date2]: unrecognized selector sent to instance 0x102f20b50)는보고하는 행에 적합하지 않습니다. 무슨 일이있을거야.

원래 질문을 새 코드로 업데이트하고 myObject 클래스의 헤더를 표시 할 수 있습니까?

+0

업데이트 됨, 감사합니다. – user3504848

0

sortedArrayUsingComparator을 사용하여 배열을 정렬하는 것이 더 낫다고 생각합니다.

NSDate *currentDate = [NSDate date]; 

    NSArray *sortedFixtureObjectArray = [newFixtureObjectArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 

     if (![obj1 isKindOfClass:[FixturesObject class]]) 
      return NSOrderedDescending; 
     else if (![obj2 isKindOfClass:[FixturesObject class]]) 
      return NSOrderedAscending; 

     FixturesObject *one = (FixturesObject *)obj1; 
     FixturesObject *two = (FixturesObject *)obj2; 

     double firstInterval = [one.date2 timeIntervalSinceDate:currentDate]; 
     double secondInterval = [two.date2 timeIntervalSinceDate:currentDate]; 

     firstInterval = (firstInterval < 0 ? -1 * firstInterval : firstInterval); 
     secondInterval = (secondInterval < 0 ? -1 * secondInterval: secondInterval); 

     if (firstInterval < secondInterval) 
      return NSOrderedAscending; 
     else if (firstInterval > secondInterval) 
      return NSOrderedDescending; 

     return NSOrderedSame; 

    }]; 

이렇게하면 0 번째 항목이 현재 날짜에 가장 가까운 시간 간격을 가진 정렬 된 배열을 생성합니다.

블록 외부에 currentDate을 선언했음을 알게 될 것입니다. 이렇게하면 매번 새로운 날짜가 아닌 동일한 날짜로 모든 날짜를 비교하게됩니다.

+0

- [NSNull date2] : 인식 할 수없는 셀렉터가 인스턴스 0x102f1fb50에 전송되었습니다. 내 첫 번째 배열에는 인덱스 0이 있고 인덱스 1에는 널 (Null)이 있습니다.이 새 배열에 대해 어떻게 추가 할 수 있습니까? inserobjectatindex는 변경 가능한 배열에만 해당합니다. – user3504848

+0

개체의 유형이 NSNull이고 [object isKindOfClass : [NSNull class]]인지 확인 할 수 있습니다. 해당 객체가 객체 1이면 NSOrderedDescending을 반환하고 그렇지 않으면 NSOrderedAscending을 반환합니다. –

+0

더 나은 점은 FixturesObjects인지 확인하십시오. –

관련 문제