2015-03-28 1 views
0

Я получаю поток из живой передачи. Это выглядит примерно так, как mutableArray:Интерпретация потока данных в объекте c

"Columbia Heights", 
    E04, 
    "Cleveland Park", 
    A05 

Первая строка является именем, а второй является код станции.

Мне нужно превратить это в словарь, совместимый с Plist.

Так что результат в виду, будет выглядеть следующим образом:

name: 
"Columbia Heights", 
code: 
     E04, 
name: 
     "Cleveland Park", 
code: 
     A05 

То, что я написал до сих пор это:

NSMutableDictionary *stationDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"Name",@"name",@"Code",@"code", nil]; 

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

     // get names and codes for each of 3 fave stations 
     //[stationArray addObject:[mutableFaveArray objectAtIndex:i]]; 

     NSString *tempName = [mutableFaveArray[i] valueForKey:@"name"]; 
     NSString *tempCode = [mutableFaveArray[i] valueForKey:@"code"]; 



     [stationDict setObject:tempName forKey:@"name"]; 
     [stationDict setObject:tempCode forKey:@"code"]; 

    } 

Я больше не получаю сообщение об ошибке, но я получаю в качестве выходного сигнала, такой же, как мой вход .. Я тоже только получать последнюю запись ..

"Cleveland Park", 
     A05 

Обновленный код:

NSMutableDictionary *stationDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"Name",@"name",@"Code",@"code", nil]; 

    int i = 0; 
    for (i=0; i < mutableFaveArray.count; i++) { 

     NSString *tempName = [mutableFaveArray[i] valueForKey:@"name"]; 
     NSString *tempCode = [mutableFaveArray[i] valueForKey:@"code"]; 

     [stationDict setObject:tempName forKey:@"name"]; 
     [stationDict setObject:tempCode forKey:@"code"]; 

     [stationArray addObject:stationDict]; 

    } 

В результате последнего словарной записи сохраняются в два раза ..

{ 
     code = A05; 
     name = "Cleveland Park"; 
    }, 
     { 
     code = A05; 
     name = "Cleveland Park"; 
    } 
+0

Ваш вопрос непонятен. Пожалуйста, лучше объясните, что вы пытаетесь сделать. – rmaddy

+0

ОК. переписывание .. –

+0

Хорошо. Это достаточно легко. что ты уже испробовал? Просто выполните итерацию массива и добавьте значения в словарь. – rmaddy

ответ

1

Проблема заключается в том, что вы только создание единого словаря, stationDict, перед циклом for. Затем вы попадаете в цикл for, который изменяет значения в stationDict, добавляет stationDict в stationArray, снова изменяет значения в stationDict, добавляет тот же словарь к stationArray и так далее. То, что вы в конечном итоге, это массив, который содержит один и тот же объект, повторенный mutableFaveArray.count раз.

Решение состоит в том, чтобы создать новый словарь в начале тела цикла for или добавить копию словаря для добавления в массив. Так, как это:

for (i=0; i < mutableFaveArray.count; i++) { 
    stationDict = [NSMutableDictionary dictionary]; 
    //...continue with the rest of your code... 

или это:

//...other for loop code precedes this... 
    [stationArray addObject:[stationDict copy]]; 
} 

Любой подход гарантирует, что каждая вещь, которую вы добавить в массив является словарь, это отличается от других, которые вы добавили. Как уточнение, вы, вероятно, могли бы немного ускорить работу кода, используя непеременный словарь. Если вам нужно создавать новый словарь каждый раз через цикл, вы можете создать его с данными, которые вы хотите, чтобы они содержали, а не сменять объекты, поэтому вам необязательно изменять его. Кроме того, вы можете объявить переменную цикла внутри инструкции for, которая гарантирует, что она выйдет за пределы области действия, как только завершится for.Кроме того, вы можете использовать Objective-C обозначения для словарей:

NSMutableArray *stationArray = [NSMutableArray array]; 
for (int i=0; i < mutableFaveArray.count; i++) { 
    [stationArray addObject:@{@"name":mutableFaveArray[i][@"name"], 
           @"code":mutableFaveArray[i][@"code"]}]; 
} 

Вы можете еще больше сократить, что и, возможно, ускорить его немного, используя быстрое перечисление:

NSMutableArray *stationArray = [NSMutableArray array]; 
for (NSDictionary *fave in mutableFaveArray) { 
    [stationArray addObject:@{@"name":fave[@"name"], 
           @"code":fave[@"code"]}]; 
} 

Или вы можете позволить mutableFaveArray сделать Enumerating для вас:

__block NSMutableArray *stationArray = [NSMutableArray array]; 
[mutableFaveArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)) 
    { 
     [stationArray addObject:@{@"name":obj[@"name"], 
            @"code":obj[@"code"]}]; 
    }]; 

Это последнее может быть немного быстрее, но, возможно, немного труднее читать.

+1

Спасибо тонну. Я очень ценю ваш ответ. Оба варианта работают - я выбрал вторую. Какое облегчение. Я могу перестать вытягивать волосы. –

Смежные вопросы