0

画像を非同期に読み込もうとすると、「キャッチされていない例外 'NSUnknownKeyException' が原因でアプリを終了しています。理由: '[ valueForUndefinedKey:]: このクラスは、キー img のキー値コーディングに準拠していません。'」というエラーが表示されます。 私のコードは次のとおりです。下

 NSString *str = "URL of an image";

    NSMutableDictionary *record = [NSMutableDictionary dictionary];
    [record setObject:str forKey:@"img"];

    record = [_array objectAtIndex:indexPath.row];



   dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,  0ul);
    if ([record valueForKey:@"img"]) {
        NSLog(@"in if");
        cell.m_img.image =  [record valueForKey:@"img"];
    } else {
        dispatch_async(queue, ^{
             NSLog(@"in else");
            NSURL  *imageurl = [[NSURL alloc] initWithString:str];
            NSData *image = [[NSData alloc] initWithContentsOfURL:imageurl];

            dispatch_async(dispatch_get_main_queue(), ^{
                [record setValue:[UIImage imageWithData:image] forKey:@"img"];

                [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
            });
        });
    }

ここでどこが間違っているのか教えてください。ありがとうマユル

4

4 に答える 4

1
 Check if object in array is of dictionary type

  NSString *str = "URL of an image";

    NSMutableDictionary *record = [NSMutableDictionary dictionary];

if([[_array objectAtIndex:indexPath.row]isKindOfClass:[NSDictionary class]])
    record = [_array objectAtIndex:indexPath.row];
else
      [record setObject:str forKey:@"img"];


   dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,  0ul);
    if ([record valueForKey:@"img"]) {
        NSLog(@"in if");
        cell.m_img.image =  [record valueForKey:@"img"];
    } else {
        dispatch_async(queue, ^{
             NSLog(@"in else");
            NSURL  *imageurl = [[NSURL alloc] initWithString:str];
            NSData *image = [[NSData alloc] initWithContentsOfURL:imageurl];

            dispatch_async(dispatch_get_main_queue(), ^{
                [record setValue:[UIImage imageWithData:image] forKey:@"img"];

                [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
            });
        });
    }
于 2013-06-10T13:08:15.850 に答える
1

交換

[record valueForKey:@"img"]

[record objectForKey:@"img"]
于 2013-06-10T12:47:27.373 に答える
0

あなたのコメントと答えの助けを借りて問題を解決しました。私がしたことは、グローバルに使用されるクラスで NSMutable Dictionary を作成し、変数を初期化することでした。助けてくれてありがとう

arr = [[NSMutableDictionary alloc] init];


dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,  0ul);
    if ([[[DataManager sharedInstance] arr] objectForKey:str]) {
        NSLog(@"in if");

         [cell m_img].image = [UIImage imageWithData:[[[DataManager sharedInstance] arr] objectForKey:str]]; 
    } else {
        dispatch_async(queue, ^{
             NSLog(@"in else");



                NSURL  *imageurl = [[NSURL alloc] initWithString:str];
                NSData *image = [[NSData alloc] initWithContentsOfURL:imageurl];
                [[[DataManager sharedInstance] arr] setObject :image forKey:str];
                [cell m_img].image = [UIImage imageWithData:[[[DataManager sharedInstance] arr] objectForKey:str]]; 

        });
    }
于 2013-06-11T06:54:08.027 に答える