Objective-c对集合的操作实在在麻烦了,特别是对于复杂的集合

2013-09-05 21:58:22 +08:00
 refresh
数据是从JSON中转换过来的,所有有非常多的NSArray和NSDictionary,然后这些数据需要修改,然后我就疯了,一个个转换为NSMutable去改,JS处理这些东西是分分钟的事啊,简单要被弄疯了。
例如有一个数据:
var data = {
user:[{
role: [1, 3, 4],
address:{
city: "biejing"
}
}]
}

把这个JSON数据转换为dict,然后要修改其中的city为shanghai,js只需要data.user[0].address.city = 'shanghai'就行了,objective-c就疯了。

有啥好招没,可能是我水平太烂,求教。
4402 次点击
所在节点    iDev
34 条回复
sharpnk
2013-09-05 22:06:55 +08:00
为什么不给user做一个model,然后用你的raw json直接map过去?

然后就是你的 [arrayName objectAtIndex:i].address.city
txx
2013-09-05 22:21:21 +08:00
字典效率不如 model化啊。用字典是 不好的习惯 特别是在游戏里
tgfbeta
2013-09-05 22:24:25 +08:00
[NSJSONSerialization JSONObjectWithData:data
options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves
error:nil];
refresh
2013-09-05 22:32:51 +08:00
@sharpnk
@txx
确实应该model化,我现在也是model化,但是未彻底model化,当时是有其它考虑,但看来得不偿失了,谢谢提醒。


@tgfbeta 这个是转换的时候转为Mutable吗,但并不能解决问题。
refresh
2013-09-05 22:34:31 +08:00
@sharpnk
@tgfbeta 本来想省点事,结果发现更多事了,之前也想过model化,但因为某些原因只model化某一部分内容,浪费了我两天时间
cloudream
2013-09-05 22:43:29 +08:00
ios7里objective-c可以和js互动了……

JSContext* context = [[JSContext alloc] init];
[context evaluateScript:@"console.log(\"Hello JavaScript\")"];
tgfbeta
2013-09-05 22:45:59 +08:00
#import <Foundation/Foundation.h>
NSString *jsonString = @"{\"user\":[{\"role\": [1, 3, 4],\"address\":{\"city\": \"biejing\"}}]}";
int main(int argc, const char * argv[])
{

@autoreleasepool {

// insert code here...
NSLog(@"Hello, World!");
NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
NSMutableDictionary * dict = [NSJSONSerialization JSONObjectWithData:data
options:NSJSONReadingMutableContainers
error:&err];
dict[@"user"][0][@"address"][@"city"] = @"Shanghai";
NSLog(@"%@",dict);

}
return 0;
}
tgfbeta
2013-09-05 22:48:17 +08:00
@cloudream 这太大杀器了也……
refresh
2013-09-05 22:56:31 +08:00
@tgfbeta 这样也行?长知识了,这样和model化哪个好?

@cloudream 那是以后的事了
tgfbeta
2013-09-05 23:05:46 +08:00
@refresh model化是指使用CoreData模型?还是用@property存字符串和数据?
容器的效率虽然没有这些高,但一般来说还过的去。
主要看调用频率、数据量、内存占用状况、模型修改频率了。如果没有必要不需要优化。
dorentus
2013-09-05 23:15:13 +08:00
Model framework for Cocoa and Cocoa Touch
https://github.com/github/Mantle

我最近的项目在用这个做 JSON dictionary <==> model class
PrideChung
2013-09-06 00:10:28 +08:00
Foundatin提供的数据结构要转换为mutable就一个mutableCopy的事,能有多麻烦,难道你不知道数组和字典的新下标语法么。
alexrezit
2013-09-06 08:52:51 +08:00
只能说明你菜, 不能说明它麻烦.
refresh
2013-09-06 09:04:29 +08:00
@alexrezit 我认同这个结论

@PrideChung 我知道定义词典和NSArray可以用@{}与@[],也知道NSArray可以用[index]的方式取,但不知道dict也可以这样,确实方便很多。

@tgfbeta 准备改成property的方式,有必要么?

@dorentus 看上去似乎不错

谢谢各位老师
refresh
2013-09-06 09:11:23 +08:00
再问一个菜鸟问题,对于JSON的字段名称,你们是专门建一个类,内建各种字段做影射,还是用define或者static呢?

我现在是建一个类,然后用类方法返回字段的名称。比如说:
1. json = {user: "uname"}
2. mapping:

+(NSString*) userField{
return @"user";
}

或者用这样:
static NSString *kJSONFieldUser = @"user";
或者:
#define kJSONFieldUser @"user"

各位老师,你们是怎么处理?

@PrideChung
@tgfbeta
@alexrezit
@cloudream
alexrezit
2013-09-06 09:15:22 +08:00
@refresh
你是想用 ORM 么?
refresh
2013-09-06 09:19:54 +08:00
@alexrezit 不是想用ORM,对于JSON中的字段名,因为经常要用,直接用@"user"肯定不合适,所以固定下来。
alexrezit
2013-09-06 09:21:37 +08:00
@refresh
那种我都是
extern NSString * const kBlahBlahBlah;
NSString * const kBlahBlahBlah = @"blah";
refresh
2013-09-06 09:32:06 +08:00
@alexrezit 这种方式不能在全局下使用啊,因为很多类都要用到
alexrezit
2013-09-06 10:13:54 +08:00
@refresh
#import

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/81462

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX