【问题标题】:How to sort NSMutableArray key by date (Facebook Birthdays?)如何按日期对 NSMutableArray 键进行排序(Facebook 生日?)
【发布时间】:2012-08-09 22:08:25
【问题描述】:

我尝试使用 NSSortDescriptor 对 NSMutableArray *friends, key:birthday, 按日期进行排序,我的 NSLog 中的所有生日都为空,但名称仍在记录中。如果我拔出我的 NSSortDescriptor,我的 NSLog 将再次给我这些值,想知道为什么我在通过 NSSortDescriptor 传递它们时会丢失这些值,以及我如何才能实现这一点。我使用 Hackbook 示例代码来学习 Facebook 集成,并修改了代码给我朋友的生日,并且我想让他们按照 1/1 - 12/31 的格式对 1 月 - 12 月进行排序是不是因为随机拉动朋友列表的结果数据?提前感谢您,一旦我们查明真相,我一定会接受!

******************************CODE TO PULL KEYS BIRTHDAY AND NAMES FROM GRAPH API ******

   - (void)getUserFriends {
currentAPICall = kAPIGraphUserFriends;
HackbookAppDelegate *delegate = (HackbookAppDelegate *)[[UIApplication sharedApplication]      delegate];
NSMutableDictionary *params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                            @"name, birthday",  @"fields", nil];
[[delegate facebook] requestWithGraphPath:@"me/friends" andParams:params andDelegate:self];
[self apiGraphFriends];
}


  ***********RANDOMIZE LIST OF FRIENDS NAMES W BIRTHDAYS AND PUSH TO VIEW CONTROLLER

NSMutableArray *friends = [[NSMutableArray alloc] initWithCapacity:1];
NSArray *resultData = [result objectForKey:@"data"];
if ([resultData count] > 0) {
    for (NSUInteger i=0; i<[resultData count] && i < 1000; i++) {
        [friends addObject:[resultData objectAtIndex:i]];
    }
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"birthday"
                                                                   ascending:TRUE];
    [friends sortUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
    [sortDescriptor release];

    // LOG VALUES OF KEYS birthday and name FOR DEBUGGING

    NSLog(@"name %@" , [friends valueForKey:@"name"]);
    NSLog(@"birthday %@" , [friends valueForKey:@"birthday"]);

    // Show the friend information in a new view controller
    NSLog(@"Check#3");
    APIResultsViewController *controller = [[APIResultsViewController alloc]
                                                initWithTitle:@"Friends Birthdays"
                                                         data:friends action:@""];
    [self.navigationController pushViewController:controller animated:YES];
    [controller release];
} else {
    [self showMessage:@"You have no friends."];
}
[friends release];

8/10 编辑在上面添加了代码,显示了我如何获得这些名字和生日,我相信它们都是http://developers.facebook.com/docs/reference/api/user/ 的 NSStrings 只需向下滚动到生日部分。我还想提一下,非常重要的是,我已经扩展了权限,这不是权限问题,当我尝试对数组进行排序时,我做错了,我相信我的经验不足是我自己最大的敌人。谢谢!

【问题讨论】:

  • 您的代码没有任何明显错误。生日是 NSDate 对象吗?
  • 这就是杀死我的原因,我只是无法弄清楚为什么在运行该 NSSortDescriptor 时它会丢弃“生日”的值,我将发布我进行查询的代码,因为它涉及 NSMutDict。这就是为什么我可能在这方面完全错了。
  • 码猴,我之前看到你发了一些代码,但是我回来看的时候没看到,你删了吗?感谢你! *编辑不,我没有任何运气,现在我被困在一个布尔...也许你可以帮忙吗?大声笑

标签: objective-c ios xcode facebook-graph-api nsmutablearray


【解决方案1】:

这可以帮助您识别问题。通常,这允许您使用自定义比较器对列表进行排序,但确定 sortUsingDescriptors 将您的生日归零的原因可能很有用。可能您的一个或多个生日无效。

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
                             initWithKey:@"birthday"
                               ascending:YES
                              comparator:^NSComparisonResult(id obj1, id obj2) {
                                  NSLog(@"bday1 = '%@' bday2 = '%@'", obj1, obj2);
                                   return NSOrderedSame;
                              }];

【讨论】:

  • 就是这样!感谢 Code Money,我会尝试一下。是的!实际上我应该提供这些信息,而不是每个人都在 facebook 上列出他们的生日,所以我说 500 个朋友的生日中有 15% 确实为空,但这会导致 sortUsingDescriptors 将它们全部归零吗?
  • 当需要比较两个对象(在本例中为生日)时,sortUsingDescriptors 会调用上述代码。我添加了一个 NSLog 以在比较对象对时打印它们。
  • 不想这么说,但它只是将它们归零,这意味着 NSLog 甚至不显示任何内容,如果只是 NSLog(@"birthday %@" , [friends valueForKey:@"birthday"]);我得到要在控制台中列出的生日,每一个像 5 或 6 可能有一个空的,但那是他们没有输入一个。就在我尝试在将列表推送到表格视图之前对其进行排序时,它们被消灭了...我只是不知道如何以这种方式对它们进行排序:(我非常感谢您的努力!
  • 空值发送到 sortUsingDescriptors 不会导致所有值都为空。也许您可以通过限制数组中的项目数来缩小问题范围。例如,通过将循环设置为在 [resultData count]/2 处结束,然后在 [resultData count]/4 处结束,只添加生日的前半部分,直到生日不全为空。
  • 将数组限制为 2 个元素时会发生什么?您只需在循环中将 1000 设置为 2 即可。如果它仍然使生日无效,那么可能生日是sortUsingDescriptors 不知道如何排序的类。您可以通过在循环后添加以下内容来检查其类。 id obj = [朋友 objectAtIndex:0]; NSLog(@"class= %@",[[[obj 生日] 类] 描述]);
猜你喜欢
  • 1970-01-01
  • 2023-04-11
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 2020-10-30
相关资源
最近更新 更多