2012-04-12 11 views
1

ich den Code wie unten haben. Ich lade JSON von einem Webserver ab.setValue forKey in NSMutableDictionary stürzt

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) 
            {  

             for (NSMutableDictionary * dataDict in JSON) { 


              if ([dataDict objectForKey:@"userPicture"]) 
              { 

               objectForKey:@"userPicture"]); 
               NSURL *url = [NSURL URLWithString:[dataDict objectForKey:@"userPicture"]]; 
               UIImage *image = [UIImage imageWithData: [NSData dataWithContentsOfURL:url]];  


               [dataDict setValue:@"userPicture" 
                  forKey:@"userPicture"]; 


              } 


              [messageList addObject: dataDict]; 
             }            

             [self processComplete]; 

            } 
            failure:^(NSURLRequest *request , NSURLResponse *response , NSError *error , id JSON) 
            { 
             NSLog(@"Failed: %@", error);   

            }]; 

jedoch mit dem folgenden Fehler abstürzt:

* Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object'

Nun, was ich nicht bekommen, ist, dass ich zu setValue:forKey in dataDict bin versucht, die NSMutableDictionary instanziert wird, so sollte ich sein kann setValue.

Ich bin ein Anfänger-Programmierer, so entblößen bitte mit mir :)

Vielen Dank im Voraus, Fischer

Antwort

4

Sie haben Ihre dataDict als NSMutableDictionary deklariert, aber das bedeutet nicht, dass Sie ein veränderliches Wörterbuch von Ihrem JSON erhalten. Was Sie tun können, ist entweder anweisen, Ihre JSON Serializer Sie änderbare Kopien zu holen (wenn es solche Option unterstützt) oder manuell:

for (NSDictionary *dict in JSON) { 

    NSMutableDictionary * dataDict = [dict mutableCopy]; 
    // Rest of the code here... 

} 
+0

Denken Sie daran, 'dataDict' freizugeben. – jrtc27

+0

@ jrtc27 Wahr. Ich wollte nur den veränderlichen Teil betonen (auch nicht jetzt, wenn der Typ ARC verwendet). – Alladinian

+0

Er könnte ARC verwenden. Ich vergesse es oft, da es in keinem meiner Projekte verwendet wird. – jrtc27

1

dataDict ist nur ein Zeiger wird nicht instanziiert.

Sie es zu tun haben tatsächlich mit einfachen NSDictionary, so können Sie es nicht ändern. Wenn Sie es ändern müssen, rufen Sie einfach mutableCopy darauf an. Dadurch werden Sie zum Eigentümer des Objekts. Wenn Sie also ARC nicht verwenden, denken Sie daran, es nach Abschluss des Vorgangs wieder freizugeben.

+1

Mit anderen Worten, typecasting ein Objekt zu einem wandelbaren Wörterbuch macht es keinen wandelbar machen Wörterbuch. – Till

Verwandte Themen