0

目標:1つの共通キー値「delay」で返されたすべてのNSDictionaryを1つのNSMutablearryに結合します。これを使用して、結果(trueまたはfalse)を比較し、緑または赤のピンをマップに配置できます。
このコードは、要求された空港の辞書に変換するJSONの空港データを返します。キーはいくつかありますが、コードのこの部分では、1つのNSMutablearryに結合したい「遅延」の1つだけに関心があります。
一度にリクエストできる空港は1つだけなので、リクエストされた各空港が個別に返され、9セットのデータが取得されます。私が欲しいのは、9つの異なる空港用の9つの遅延キーをすべて1つの配列にまとめたものです。

`- (void)configureData
{

self.airportCodes = [[NSArray alloc] initWithObjects:

                     @"ATL",
                     @"BOS",
                     @"BWI",
                     @"CLT",
                     @"CVG",
                     @"DEN",
                     @"EWR",
                     @"ORD",
                     @"SFO",
                     nil];

NSUInteger airportCount = self.airportCodes.count;


for(int i=0; i < airportCount;i++){

    NSURL *url = [self urlWithSearchText:[self.airportCodes objectAtIndex: i]];
    NSString *jsonString = [self performAirportRequestWithURL:url];
    if (jsonString == nil) {
        [self showNetworkError];

    }


    NSDictionary *dictionary = [self parseJSON:jsonString];
    if (dictionary == nil) {
        [self showNetworkError];
    }

    self.airportDelays = [[NSMutableArray alloc] initWithCapacity:9];


    [self parseDelay:dictionary];

    //NSLog(@"AP Delays %@",self.airportDelays);
} 

return;
}


-  (void)parseDelay:(NSDictionary *)dictionary
{


//self.delay = [dictionary objectForKey:@"delay"];
[self.airportDelays addObject:dictionary];



NSLog(@"AP Delays %@",self.airportDelays);

return;
}

- (NSURL *)urlWithSearchText:(NSString *)searchText
{
NSString *escapedSearchText = 
[searchText    stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *urlString = 
[NSString stringWithFormat:
@"http://services.faa.gov/airport/status/%@? format=application/json", escapedSearchText];
NSURL *url = [NSURL URLWithString:urlString];
return url;
}

- (NSString *)performAirportRequestWithURL:(NSURL *)url
{
NSError *error;
NSString *resultString = [NSString stringWithContentsOfURL:
url encoding:NSUTF8StringEncoding error:&error];
if (resultString == nil) {
    NSLog(@"Download Error: %@", error);
    return nil;
}
return resultString;
}

- (void)showNetworkError
{
UIAlertView *alertView = [[UIAlertView alloc]
                          initWithTitle:@"Whoops..."
                          message:@"There was an error reading 
                          from the FAA Server. Please      try again."
                          delegate:nil
                          cancelButtonTitle:@"OK"
                          otherButtonTitles:nil];
[alertView show];
}


- (NSDictionary *)parseJSON:(NSString *)jsonString
{
NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];

NSError *error;
id resultObject = [NSJSONSerialization JSONObjectWithData:data options:
kNilOptions     error:&error];
if (resultObject == nil) {
    NSLog(@"JSON Error: %@", error);
    return nil;

    if (![resultObject isKindOfClass:[NSDictionary class]]) {
        NSLog(@"JSON Error: Expected dictionary");
        return nil;
    }
}
return resultObject;
}

@end`
4

1 に答える 1

1

問題は次のとおりです。新しいディクショナリが作成されるたびにairportDelays配列をインスタンス化するため、airportDelay配列を破棄して新しいディクショナリを作成する前に、ディクショナリを1つだけ追加します。下記参照

self.airportDelays = [[NSMutableArray alloc] initWithCapacity:9];


[self parseDelay:dictionary];

する必要があります

if (!self.airportDelays) {
    self.airportDelays = [[NSMutableArray alloc] initWithCapacity:9];
}
[self parseDelay:dictionary];

また、forループを使用してネットワーク操作を行うことにうんざりしています。おそらく、別のキューイングメカニズムを使用しているはずです。このメカニズムでは、プログラムは最初のディクショナリの応答を待ってから、Webサービスに次のディクショナリを要求します。しかし、それは別の時間の別のレッスンかもしれません。

幸運を

于 2012-11-14T17:51:06.663 に答える