1
NSDictionary *tokenData = [[responseDict objectForKey:@"data"] objectForKey:@"multipass"];
dispatch_async(dispatch_get_main_queue(), ^{
    NSString *card = [NSString stringWithFormat:@"%@-%@",
        [[UserAccount sharedInstance] cardNumber],
        [tokenData objectForKey:@"CardPhoneToken"]]; //<-- problem
});

tokenData私は昨日からこのコード行と格闘してきました。サーバーから JSON フィードを取得し0ています nad Dictionary. コンパイラによってもブール値として扱われるため、返される0と(理由もわかりません)、エラーが発生します-[NSCFBoolean objectForKey:]: unrecognized selector sent to instance 0x81aa20

私はこのようなことを試みまし たが、返されたif(!tokenData) { NSLog(@"This is going to crash"); }ときに呼び出されません。tokenData0if

私が得ているesponseDict JSON: { code = 200; data = { multipass = { CardPhoneBarcodeToken = 562431; CardPhoneToken = 23221; errorMessage = ""; operationResult = 0; }; }; }

これは、クラッシュする直前の様子です。{ code = 200; data = { multipass = 0; }; }

更新:セクションで別の問題に直面してtokenDataいない場合は、何とか対処できました。ではない場合、tokenData をリロードするにはどうすればよいですか? *tokenData = [[responseDict objectForKey:@"data"] objectForKey:@"multipass"]; を呼び出してみました。else の内部ですが、tokenData = 0 を取得し続けています ありがとうNSDictionaryelseNSDictionary

4

2 に答える 2

3

解析する前にtokenDataaかどうかを確認します。NSDictionary

-(void)loadData
{
    NSDictionary *tokenData = [[responseDict objectForKey:@"data"] objectForKey:@"multipass"];
    dispatch_async(dispatch_get_main_queue(), ^{
        NSString *cardPhoneToken = @"";
        if( [tokenData isKindOfClass:[NSDictionary class]] ){
            retryCount = 0;
            cardPhoneToken = [tokenData objectForKey:@"CardPhoneToken"];
        } else {
            NSLog(@"failed to load data, retrying...");
            retryCount++;
            if( retryCount < 5 ){
                [self loadData];
                return;
            } else {
                NSLog(@"failed after 5 retries");
            }

        }
        NSString *card = [NSString stringWithFormat:@"%@-%@",
                          [[UserAccount sharedInstance] cardNumber],
                          cardPhoneToken];

    });
}
于 2013-01-09T08:30:58.003 に答える
1

おなじみですね。:)

ブロックを次のように変更します。

^{
    NSString *card;
    if ([tokenData isKindOfClass [NSDictionary class]) {

      card = [NSString stringWithFormat:@"%@-%@",
          [[UserAccount sharedInstance] cardNumber],
          [tokenData objectForKey:@"CardPhoneToken"]]; // <<-- No Problem anymore
     } else {
       // deal with the situation. Probably do: 
      card = [NSString stringWithFormat:"%@-no phone number given", [UserAccount sharedInstance] cardNumber]];
}

別:

^{
    id cardPhoneToken;
    if ([tokenData]) {
       cardPhoneToken = [tokenData objectForKey:@"CardPhoneToken"];
    } else {
       cardPhoneToken = @"no Phone Token"; // Or what ever you think is appropriate
    }
    NSString *card = [NSString stringWithFormat:@"%@-%@",
        [[UserAccount sharedInstance] cardNumber],
        cardPhoneToken]; // <<-- No Problem anymore

}
于 2013-01-09T08:34:00.410 に答える