【问题标题】:Returning object inside array with closest date to NOW返回与现在日期最近的数组内的对象
【发布时间】:2014-04-07 00:22:13
【问题描述】:

我有一个包含对象的数组,每个对象都有一个名为“日期”的属性,我想通过该数组找到与当前日期最接近的对象。

#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);
    }
}

已按要求更新,非常感谢大家的帮助!

【问题讨论】:

  • 我们能否看到FixturesObject 的公共接口,因为myObject.date 似乎是NSString 的一个实例?
  • 它是 NSString 的一个实例
  • 我用 NSDate 创建了第二个属性,错误消失了,但现在它只是因为这个错误而崩溃:-[NSNull date2]: unrecognized selector sent to instance 0x102f20b50 @ this line : if (interval
  • 我建议在循环中放置一个断点并确保 date2 是 NSDate 类的对象。
  • 我发现问题是我的主数组是可变的,我在索引 0 和 1 处插入了 2 个空对象,它们必须保留在那里,否则会破坏我的应用程序设计,所以.. . 如何在索引 0 和 1 处为 nsarray 添加一个空对象? :P

标签: ios objective-c nsdate


【解决方案1】:

您需要确保 myObject.date 是 NSDate 类的对象。如果它是其他类型的对象,它将不起作用。如果 myObject.date 为 nil,它也不会正常工作。

您报告的新错误 ([NSNull date2]: unrecognized selector sent to instance 0x102f20b50) 对于您报告它的行没有意义。一定有别的事情发生了。

你能用你的新代码更新你原来的问题,并显示你的myObject类的标题吗?

【讨论】:

    【解决方案2】:

    我认为您最好使用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。这样您就可以将所有日期与同一日期进行比较,而不是每次都使用新日期。

    【讨论】:

    • -[NSNull date2]:无法识别的选择器发送到实例 0x102f1fb50,我的数组。我的第一个数组有索引 0,索引 1 有 Null,我怎样才能为这个新数组添加相同的? inserobjectatindex 仅适用于可变数组
    • 您可以使用 [object isKindOfClass:[NSNull class]] 检查对象是否为 NSNull 类型。如果该对象是对象 1,则返回 NSOrderedDescending,否则返回 NSOrderedAscending。
    • 更好的是,检查以确保它们都是 FixturesObjects。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多