2017-06-19 40 views
0

我正在一個目標C應用程序,我正在採取JSON數據,我需要插入此數據(日期)內字典fillDefaultColors。我fillDefaultColors應該是格式如下:目標C NSDictionary JSON在一行

self.fillDefaultColors = @{ @"2017/06/18":greenColor, 
           @"2017/06/19":orangeColor, 
           @"2017/06/20":greenColor, 
           ... 
           }; 

,但是當我在控制檯日誌打印它們分別在不同的行和應用程序,我可以從JSON

2017-06-19 15:30:12.310 CalendarTest[1905:364525] { 
    "2017/06/20" = "greenColor"; 
} 
2017-06-19 15:30:12.311 CalendarTest[1905:364525] { 
    "2017/06/18" = "orangeColor"; 
} 

所以看顏色只爲最後一個項目在應用我看到最後日期背景控制檯2017年6月18日

這裏是我的代碼

NSError *error = nil; 
    NSURL *url = [NSURL URLWithString: @"http://..."]; 
    NSData *data = [NSData dataWithContentsOfURL:url options:NSDataReadingUncached error:&error]; 

    if(!error) 
    { 
     NSDictionary* json = [NSJSONSerialization 
           JSONObjectWithData:data 
           options:NSJSONReadingMutableContainers 
           error:&error]; 

     NSMutableArray *array= [json objectForKey:@"horses"]; 

     for(int i=0; i< array.count; i++) 
     { 
      NSDictionary *horsedata = [array objectAtIndex:i]; 
      NSString *date = [horsedata objectForKey:@"date"]; 
      NSNumber *averagetemp = [horsedata objectForKey:@"averagetemperature"]; 
      if([averagetemp isEqual:@(28)]) {tempColor = greenColor;} else { 
       tempColor = orangeColor; 
      } 
      self.fillDefaultColors = @{date: tempColor}; 
      NSLog(@"%@", _fillDefaultColors); 

     } 

    } 

JSON: {"horses":[{"id":1,"name":"Horse","date":"2017/06/17","averagetemperature":28},{"id":1,"name":"Horse","date":"2017/06/18","averagetemperature":25}]} 

Thanks 
+0

'self.fillDefaultColors = @ {date:tempColor};'你每次都覆蓋'self.fillDefaultColors'。 '[self.fillDefaultColors setObject:tempColor forKey:date];',並且您需要在某處執行'self.fillDefaultColors = [[NSMutableDictionary alloc] init];'請注意,如果您有一些等於'date'的值,由於鍵是唯一的,因此'object'(value)將被替換。 – Larme

+1

除了問題**永遠不會**使用像dataWithContentsOfURL這樣的同步方法從遠程URL加載數據。它會阻止當前線程。爲什麼你傳遞選項'NSJSONReadingMutableContainers'但將結果賦給一個不可變的對象? – vadian

+0

@vadian我是新來的目標C,我發現這個代碼在互聯網教程... – MKovac

回答

1

這是因爲你被分配在每個迭代一個新的字典:

self.fillDefaultColors = @{date: tempColor}; 

你需要自行添加:

NSMutableArray *array= [json objectForKey:@"horses"]; 
    self.fillDefaultColors = [[NSMutableDictionary alloc]init]; 
    for(int i=0; i< array.count; i++) 
    { 
     NSDictionary *horsedata = [array objectAtIndex:i]; 
     NSString *date = [horsedata objectForKey:@"date"]; 
     NSNumber *averagetemp = [horsedata objectForKey:@"averagetemperature"]; 
     if([averagetemp isEqual:@(28)]) {tempColor = greenColor;} else { 
      tempColor = orangeColor; 
     } 

     [self.fillDefaultColors setObject:tempColor forKey:date]; 
     NSLog(@"%@", _fillDefaultColors); 

    } 
+0

- 感謝它的工作:) – MKovac

1

這是相同的解決方案在侯賽因的答案,但有現代Objective- C語法 - 至少在5年前推出。

NSArray *horses = json[@"horses"]; 
self.fillDefaultColors = [[NSMutableDictionary alloc] init]; 
for (NSDictionary *horsedata in horses) 
{ 
    NSString *date = horsedata[@"date"]; 
    NSNumber *averagetemp = horsedata[@"averagetemperature"]; 
    self.fillDefaultColors[date] = (averagetemp.integerValue == 28) ? greenColor : orangeColor; 

    NSLog(@"%@", _fillDefaultColors); 
}