【问题标题】:Getting key value from NSDictionary with GooglePlus class使用 GooglePlus 类从 NSDictionary 获取键值
【发布时间】:2013-10-08 16:37:21
【问题描述】:

我有一个名为 itemDict 的 NSDictionary 并且在打印时

NSLog(@"itemDictValues:%@",itemDict);

输出格式如下:

itemDictValues:
GTLPlusPerson 0xab821e0: 
{etag:""LTv_6IJISeUQGTVXLjMeOtebkoM/eup2crXcelmpMFKesXWlGkJjCiE"" kind:"plus#person" id:"1145282979128841" objectType:"person" displayName:"FirstName LastName" image:{url} url:"https://plus.google.com/1145282979128841"}

据此,我需要将 iddisplayNameurl 对应的值提取到我的 NSString 变量中,格式如下

profileId=1145282979128841;

Name=FirstName LastName;

Profilepic=https://plus.google.com/1145282979128841;

我该怎么做?

【问题讨论】:

  • 你说 itemDict 是一个 NSDictionary,但它似乎并不是基于你说它没有响应 objectForKey。你能展示一些关于 itemDict 是如何设置的代码吗?它实际上不是一个 NSDictionary,而是一个 GTLPlusPerson?
  • NSMutableArray *friends=[NSMutableArray 数组]; for(NSDictionary * itemDict in peopleFeed.items) { SocialProfile *friend=[[SocialProfile alloc] initWithDictionary: itemDict socialMedia:kSocialMediaGooglePlus]; [朋友添加对象:朋友]; }
  • GTLPlusPeopleFeed *peopleFeed,是 peopleFeed 的定义方式。

标签: ios objective-c nsstring nsdictionary google-plus


【解决方案1】:

试试这个...

_profileId=(NSString*)((GTLPlusPerson*)itemDict).identifier;
_profileName= (NSString*)((GTLPlusPerson*)itemDict).displayName;
_profileImageURLPath=(NSString*)((GTLPlusPerson*)itemDict).image.url;

【讨论】:

    【解决方案2】:

    您只需解析字典即可获得所需的信息。

    NSString *profileId = [itemDict objectForKey:@"id"];
    NSString *displayName = [itemDict objectForKey:@"displayName"];
    

    现在那个图像,我认为它本身就在字典中。而且由于您尚未指定该字典中的内容,所以我认为您应该这样做:

    NSDictionary *imageDict = [itemDict objectForKey:@"image"];
    NSURL *imageURL = [imageDict objectForKey:@"url"];
    

    然后获取 UIImage 变得非常简单:

    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:imageURL];
    NSData *imageData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    UIImage *image = [[UIImage alloc] initWithData:imageData];
    

    您应该选择 sendAsynchronousRequest 方法,因为它发生在后台并且不会阻碍您应用的功能。

    【讨论】:

    • NSString *profileId = [itemDict objectForKey:@"id"] 不起作用,抛出 NSInvalidArgumentException',原因:'-[GTLPlusPerson objectForKey:]: unrecognized selector sent to instance 0xae49b60'
    【解决方案3】:

    对于一个 NSDictionary

         NSString *profileId = itemDict[@"id"]
         NSString *name = itemDict[@"displayName"]
         NSString *profilePic = itemDict[@"image"][@"url"]
    

    如果是 GTLPlusPerson 对象,则使用 objective-c 点语法访问属性

         NSString *profileId = itemDict.id;
         NSString *name = itemDict.displayName;
         NSString *profilePic = itemDict.url;
    

    从您的日志来看,它似乎是 GTLPlusPerson 对象而不是 NSDictionary

    【讨论】:

    • 抛出错误 NSInvalidArgumentException',原因:'-[GTLPlusPerson objectForKey:]: unrecognized selector sent to instance 0xae49b60'
    • 我不确定您正在解析的对象。你是在解析 NSDictionary 还是 GTLPlusPerson?
    • 您遇到无法识别的选择器问题,因为当您尝试访问 itemDict 时它为 nil。
    • @JoelFischer NSLog 的输出显示数据,所以我假设它不是 nil
    • @KyleC 那么它不是字典。就是说它不知道你调用的那个方法是什么。
    【解决方案4】:
    NSArray* peopleList = peopleFeed.items;
    NSLog(@"peopleList %@ ",peopleList.description);
    for (NSArray *dict in peopleFeed.items) {
                        NSString *peopleStrID=(NSString*)((GTLPlusPerson*)dict).identifier;
                        NSLog(@"peopleStrID %@",peopleStrID);
                        NSString *peopleName = (NSString*)((GTLPlusPerson*)dict).displayName;
                        NSString *peoplePic = (NSString*)((GTLPlusPerson*)dict).image.url;
                    }
    

    【讨论】:

      【解决方案5】:

      最简单的方法是使用 Google 提供的代码:

          if ([[GPPSignIn sharedInstance] authentication]) {
              // The user is signed in.
      
              GTLQueryPlus *query = [GTLQueryPlus queryForPeopleGetWithUserId:@"me"];
      
      
              GTLServicePlus* plusService = [[GTLServicePlus alloc] init];
                  plusService.retryEnabled = YES;
      
              //auth = GTMOAuth2Authentication object from login          
      
              [plusService setAuthorizer:auth];
      
              [plusService executeQuery:query
                      completionHandler:^(GTLServiceTicket *ticket,
                                          GTLPlusPerson *person,
                                          NSError *error) {
                          if (error) {
                              GTMLoggerError(@"Error: %@", error);
                          } else {
                              // Retrieve the display name and "about me" text
                              NSString *description = [NSString stringWithFormat:@"%@\n%@", person.displayName, person.aboutMe];
                              NSString *imageURL = person.image.url;
      
                          }
                      }];
      
      
      
          } else {
              //user is logged out
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-16
        • 1970-01-01
        • 1970-01-01
        • 2015-11-24
        • 1970-01-01
        • 1970-01-01
        • 2020-11-22
        • 1970-01-01
        相关资源
        最近更新 更多