解释 objective c 中的数据流
Interpreting a data stream in objective c
我正在从直播中获取流。它看起来像一个 mutableArray:
"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";
}
问题是您在 for
循环之前只创建了一个字典 stationDict
。然后你点击 for
循环,它改变 stationDict
中的值,将 stationDict
添加到 stationArray
,再次改变 stationDict
中的值,添加相同的值字典到 stationArray
,等等。您最终得到的是一个数组,其中包含重复 mutableFaveArray.count
次的相同对象。
解决方法是要么在for
循环体的开始处创建一个新字典,要么添加一个copy字典以添加到大批。所以,要么这样:
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
为您进行枚举:
__block NSMutableArray *stationArray = [NSMutableArray array];
[mutableFaveArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop))
{
[stationArray addObject:@{@"name":obj[@"name"],
@"code":obj[@"code"]}];
}];
最后一个可能更快一些,但可能更难阅读。
我正在从直播中获取流。它看起来像一个 mutableArray:
"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";
}
问题是您在 for
循环之前只创建了一个字典 stationDict
。然后你点击 for
循环,它改变 stationDict
中的值,将 stationDict
添加到 stationArray
,再次改变 stationDict
中的值,添加相同的值字典到 stationArray
,等等。您最终得到的是一个数组,其中包含重复 mutableFaveArray.count
次的相同对象。
解决方法是要么在for
循环体的开始处创建一个新字典,要么添加一个copy字典以添加到大批。所以,要么这样:
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
为您进行枚举:
__block NSMutableArray *stationArray = [NSMutableArray array];
[mutableFaveArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop))
{
[stationArray addObject:@{@"name":obj[@"name"],
@"code":obj[@"code"]}];
}];
最后一个可能更快一些,但可能更难阅读。