sub ob'ektlar bilan NSDictionary orqali takrorlash

Menda NSDictionary ni oladigan usul bor:

-(id)initWithJSONDictionary:(NSDictionary *)dataDictionary{
     self = [super init];
     NSLog(@"********************************* %@ ",dataDictionary);
     for(NSString * key in dataDictionary){
         if([key isEqualToString:@"filters"]){
             NSDictionary * filtersSubDict = [dataDictionary objectForKey:key];
             for(NSString *sfKey in filtersSubDict){
                 NSLog(@"new filter: %@", sfKey );               
                 NSDictionary *filterObject = [filtersSubDict objectForKey:sfKey];
                 // this line is throwing some kind of thread exception
             }
          }
      }
      return self;
}

ostidagi izohli satr nima uchun istisno keltirayotganiga oid har qanday maslahat: ** Avval qo'ng'iroqlar to'plamini tashlang:

(0x1d04012 0x1141e7e 0x1d8f4bd 0x1cf3bbc 0x1cf394e 0x1052b 0x137fe 0x259b3 0x4a6853f 0x4a7a014 0x4a6a7d5 0x1caaaf5 0x1ca9f44 0x1ca9e1b 0x1c5e7e3 0x1c5e668 0x85ffc 0x27fd 0x2725)
libc++abi.dylib: terminate called throwing an exception
(lldb) 

Butun NSDictionaryni ko'rsatadigan birinchi NSLog buni ko'rsatadi:

{
    errorCode = 0;
    filters =     (
                {
            id = 1001;
            name = "Base Lenses";
            sequence = 1;
        },
                {
            id = 1002;
            name = "Standard Anti-Reflective";
            sequence = 2;
        },
                {
            id = 1003;
            name = "Premium Anti-Reflective";
            sequence = 3;
        },
                {
            id = 1004;
            name = "Enhanced Scratch Resistance";
            sequence = 4;
        },
                {
            id = 1005;
            name = Sun;
            sequence = 5;
        },
                {
            id = 1006;
            name = Tint;
            sequence = 6;
        },
                {
            id = 1007;
            name = "Clear To Dark";
            sequence = 7;
        }
    );
    lenses =     {
        Glass =         (
                        {
                fsv = 1;
                inStore = 1;
                lom = 0;
                price = 465;
                style = "Glass Std AR";
                styleFilters =                 (
                    1002
                );
                type = "Single Vision";
                visionCorrection = singleVision;
            },
                        {
                fsv = 1;
                inStore = 0;
                lom = 1;
                price = 395;
                style = "Prem Plastic Std AR";
                styleFilters =                 (
                    1002
                );
                type = "SV HD";
                visionCorrection = singleVision;
            }
        );
        "Plastic/Hi-index" =         (
                        {
                fsv = 1;
                inStore = 1;
                lom = 0;
                price = 395;
                style = "Prem Plastic Std AR";
                styleFilters =                 (
                    1002,
                    1006
                );
                type = "SV HD";
                visionCorrection = singleVision;
            },
                        {
                fsv = 1;
                inStore = 0;
                lom = 1;
                price = 465;
                style = "Glass Std AR";
                styleFilters =                 (
                    1002,
                    1006
                );
                type = "SV HD";
                visionCorrection = singleVision;
            }
        );
        Polycarbonate =         (
                        {
                fsv = 1;
                inStore = 1;
                lom = 0;
                price = 395;
                style = "FeatherWates Classic";
                styleFilters =                 (
                    1001
                );
                type = "SV Wrap";
                visionCorrection = singleVision;
            },
                        {
                fsv = 1;
                inStore = 0;
                lom = 1;
                price = 495;
                style = "FeatherWates Classic";
                styleFilters =                 (
                    1001
                );
                type = "SV Wrap";
                visionCorrection = singleVision;
            }
        );
    };
    materials =     (
        Polycarbonate,
        "Plastic/Hi-index",
        Glass
    );
} 

Men identifikator, nom va ketma-ketlik qiymatlarini oladigan "filtrlar" dagi har bir tugun uchun yangi ob'ekt yaratishga harakat qilaman.


person erik    schedule 09.04.2013    source manba
comment
Ushbu qo'ng'iroqlar to'plami foydali emas:/ Iltimos, uni ramziy qilib ko'rsating.   -  person    schedule 09.04.2013
comment
To'xtash nuqtalari yorlig'iga o'ting va barcha istisnolar uchun to'xtash nuqtasini yoqing. Bu siz ko'rayotgan istisnoni tashlaganda tuzatuvchini buzadi.   -  person thegrinner    schedule 09.04.2013
comment
Formatlashdan keyin kodingizni ko'ring. Men +10 ga loyiq emasmi?   -  person Anoop Vaidya    schedule 09.04.2013
comment
Lug'atingizni yoki uning barglarini boshqa mavzudagi biror narsa o'zgartiryaptimi?   -  person Marcus Adams    schedule 09.04.2013


Javoblar (1)


Sizning NSLog bayonotingiz nima deyotganini ko'rmasdan yoki sizning istisnongiz nima ekanligini bilmasdan, kodingizda istisno bo'lishi mumkin bo'lgan barcha narsalar mumkin:

for(NSString *key in dataDictionary) {

Agar dataDictionary aslida NSDictionary bo'lmasa, lekin NSString, NSNumber va boshqalar kabi <NSFastEnumeration> bo'lmagan JSON ob'ekti bo'lsa, bu satr chiqishi mumkin.

    if([key isEqualToString:@"filters"]){

Agar key aslida NSString bo'lmasa va shuning uchun -isEqualToString: usulini qo'llamasa, bu qatorni tashlashi mumkin.

        NSDictionary *filtersSubDict = [dataDictionary objectForKey:key];

Agar dataDictionary tez sanab o'tiladigan JSON ob'ekti bo'lsa, lekin aslida NSDictionary bo'lmasa, bu qatorni tashlashi mumkin. (Boshqacha qilib aytganda, bu NSArray bo'lishi mumkin va bu qator "objectForKey:' selektorini tanimaydi" istisnosini keltirib chiqaradi).

        for (NSString *sfKey in filtersSubDict) {

Yuqoridagi kabi, agar filtersSubDict NSArray yoki NSDictionary bo'lmasa, bu tashlashi mumkin.

            NSLog(@"new filter: %@", sfKey );
            NSDictionary *filterObject = [filtersSubDict objectForKey:sfKey];

Agar filtersSubDict NSDictionary bo'lmasa, buning o'rniga NSArray bo'lsa (yuqoridagi kabi) bu chiqishi mumkin.

        }
    }
}

Shunday qilib, agar u filterObject = ... qatoriga tashlanayotgan bo'lsa, unda filtersSubDict aslida lug'at emasligi ehtimoli bor va siz tan olinmagan selektor istisnosiga ega bo'lasiz.

person Dave DeLong    schedule 09.04.2013