第一次尝试Obj-C的开发,求客户端数据层的设计方案? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
notedit
V2EX    iDev

第一次尝试Obj-C的开发,求客户端数据层的设计方案?

  •  
  •   notedit
    notedit 2013 年 2 月 4 日 7274 次点击
    这是一个创建于 4827 天前的主题,其中的信息可能已经有所发展或是发生改变。
    背景: 没有Obj-C的开发经验 只看了些Obj-C的基础 想在两个月的业余时间之内完成一个App的开发

    现在的需求:

    根据做后端的经验,我会把数据的访问封装起来供视图层调用.在客户端也想这样设计,但没有经验.

    现在的一个想法是 使用restkit的model map 来做Model的解析 从api取得数据之后转化为数据Model, 然后把这些数据的操作全部封装到一个类中

    不知道有没有更好的方案或者更好的类库可以使用.


    另外这个项目是自己第一次App开发的尝试,希望能遇到一个有经验的App开发者可以带我一下.
    没有直接金钱上的回报,但我可以教你python或者帮你做后端 然后做做朋友.
    35 条回复    1970-01-01 08:00:00 +08:00
    alexrezit
        1
    alexrezit  
       2013 年 2 月 4 日
    没懂楼主要做什么, 不过我觉得 Stanford CS193P 课程的第一课十有八九能解决你的问题.
    苹果官方的文档还是不错的, 用惯了他们的文档再搞 web.py 差点吐血三升. (于是至今不咋会 Python... =-=
    sivacohan
        2
    sivacohan  
    PRO
       2013 年 2 月 4 日
    @alexrezit 你可以问楼主flask
    alexrezit
        3
    alexrezit  
       2013 年 2 月 4 日
    @sivacohan
    忘了之前在哪儿看到有人说 web.py 现在不怎么更新了所以推荐用 flask.
    前一阵儿我娘想学 coding, 我还极力推荐 Python 来着~ =-=
    sivacohan
        4
    sivacohan  
    PRO
       2013 年 2 月 4 日 via Android
    @alexrezit 最近咱父母都有逆袭的趋势啊!
    notedit
        5
    notedit  
    OP
       2013 年 2 月 4 日
    @alexrezit 我是想求一个客户端数据层的设计方案
    notedit
        6
    notedit  
    OP
       2013 年 2 月 4 日
    @alexrezit oc的基础我是知道的 我想从代码组织结构方面了解一些一个App的设计
    virushuo
        7
    virushuo  
       2013 年 2 月 5 日
    restkit是个好东西。如果你的model能完全对上api模型,那么用restkit直接管理数据层没问题。但自己多少还是要明白Core Data的。

    另外restkit新版变化不小,要注意兼容问题。
    notedit
        8
    notedit  
    OP
       2013 年 2 月 5 日
    @virushuo 能给一个开源的例子么 我在github没有找到最新版restkit复杂一点的例子

    比如 我一个api 返回的结果是 多个Model组合起来的 那在客户端该怎样处理呢
    virushuo
        9
    virushuo  
       2013 年 2 月 5 日
    @notedit
    开源的例子好像没有,我也是慢慢试着来的。有问题就去翻讨论组,各种问题都有问到。

    组合起来的大概就是这样:比如你有一个Meta的Mapping ,要嵌入其他对象里面,就这样映射。
    [manager.mappingProvider setObjectMapping:[Mapping MetaMapping] forKeyPath:@"meta"];


    另外我还没迁移到最新,新的情况我还不太知道(如果用了AFNetworking就是新版)
    notedit
        10
    notedit  
    OP
       2013 年 2 月 5 日
    @virushuo 好的 多谢 另外你也是golang的爱好者 幸会
    virushuo
        11
    virushuo  
       2013 年 2 月 5 日
    @notedit 哈哈,是啊。python我也挺喜欢,不过没啥正经地方用。
    Livid
        12
    Livid  
    MOD
    PRO
       2013 年 2 月 5 日
    你可以看看这个解决方案:

    http://www.parse.com/
    notedit
        13
    notedit  
    OP
       2013 年 2 月 5 日
    @Livid 谢谢 之前用python的时候用过他们的服务 速度有些慢 而且偶尔会超时
    ewangke
        14
    ewangke  
       2013 年 2 月 5 日
    @notedit
    iOS的开发要设计先行,先把UI、交互、体验设计好。
    如何请求数据,如何设计数据层是之后的事情。

    关于代码结构:
    一般来说数据层只负责获取数据,UIController是负责交互行为的,视图一般使用标准控件或者第三方组件这些可重用的组件,很少直接写UIView。

    关于数据层内部的结构:
    猜楼主是做网络应用吧。一般api请求返回的都是json/plist这些结构化的数据。
    几种思路(由易至难):
    一、直接使用NSDictionary/NSArray(稍复杂的产品不推荐)
    二、无Model相关的类,完全在api request的callback里面更新UI部分(限制太多了,写到后面经常发现搞不定)
    三、自己使用NSObject定义一套同构的类来表示数据(好处:编译器的类型检查;坏处:写一堆代码)
    四、使用ObjC Runtime,利用反射/自省的机制,动态生成property(好处:少写很多无聊的代码;坏处:运行时才发现property存在问题)

    我倾向的方案是三;如果Model太复杂,建议写一个脚本,根据api的规则,编译期自动生成Objective-C的Model类;

    PS: @Livid推荐的Parse,做做原型还好,挺方便的。这种平台会把服务器端绑死,而且第三方的SDK能少则少。App不是Web,bug上线了就是上线了;审核至少要7天吧...
    ewangke
        15
    ewangke  
       2013 年 2 月 5 日
    @notedit
    补充一下,上面我说的第四种方案,是最“酷”的方案。很多时候,这种方式非常方便(尤其是维护阶段)。
    但它最大的问题就是不直观,而且对工程师水平要求较高(大概比例是每100个Objective-C工程师,20个听说过这种方法,敢碰的不到5个,真正用好的能有一个就不错了)。

    楼主既然练手,就都试试,没坏处。
    myrual
        16
    myrual  
       2013 年 2 月 5 日
    @ewangke 四、使用ObjC Runtime,利用反射/自省的机制,动态生成property(好处:少写很多无聊的代码;坏处:运行时才发现property存在问题)

    能解释一下什么意思么?或者给个例子?
    sharpnk
        17
    sharpnk  
       2013 年 2 月 5 日
    - 使用restkit的model map 来做Model的解析 从api取得数据之后转化为数据Model

    这个步骤restkit的object mapping+coredata完全可以一步到位. 而且像你这样API和客户端均在可控范围内的情况,选这个组合基本就是个no brainer.

    刚开始的学习曲线比较陡,但熟悉了之后能省下你很多的时间。另外它其实自己就带了不少实例代码,我基本就是靠着那几个示例外加它自带的文档一路摸索下来的。社区方面, SO还好一些, 我在restkit那个google group基本得不到任何有价值的答复。

    这个是用restkit+coredata做的:
    https://github.com/bendyworks/TravisCI.app
    PrideChung
        18
    PrideChung  
       2013 年 2 月 5 日
    @ewangke 第四种方案是指利用KeyValueCoding自动生成property?

    我发现可以用CoreData的代码生成器来生成Model Object,如果不需要持久化的话就把Transient勾上,这样还能利用到CoreData的其他功能,例如validation,relationship,不知道能不能算是方案5。

    RestKit我觉得偏重了,还是倾向于使用AFNetworking,自己做Mapping的工作。
    alexrezit
        19
    alexrezit  
       2013 年 2 月 5 日
    @ewangke
    能说英文么... 中文表示接受不能... 最后一条是指 KVC / KVO?
    notedit
        20
    notedit  
    OP
       2013 年 2 月 5 日
    @sharpnk 谢谢你的例子 现在比较倾向于使用restkit
    notedit
        21
    notedit  
    OP
       2013 年 2 月 5 日
    @PrideChung 能给个使用你这种方法的例子么 或者 开源代码
    notedit
        22
    notedit  
    OP
       2013 年 2 月 5 日
    @ewangke 谢谢你的建议 因为我现在找不到很多设计资源 所以做法是先用原生UI 把原型做出来 然后找设计设计UI.

    我的应用相对小一些 可能你说的第三种方案最适合我 在建立model方面能不能给我一点代码看
    krafttuc
        23
    krafttuc  
       2013 年 2 月 5 日
    我觉得Cheddar for iOS(https://github.com/nothingmagical/cheddar-ios)的代码挺清晰的,可以参考看看。数据层用的是Core Data,见CheddarKit。
    整个过程基本上就是用AFNetworking拉数据,解析,然后扔到Core Data做持久化。如果用到table view之类的还能用NSFetchedResultsController delegate来更新UI。
    notedit
        24
    notedit  
    OP
       2013 年 2 月 5 日
    @krafttuc 谢谢 我看一下
    ydhydh
        25
    ydhydh  
       2013 年 2 月 5 日
    JSONModel 是个不错的选择
    https://github.com/icanzilb/JSONModel
    ydhydh
        26
    ydhydh  
       2013 年 2 月 5 日
    如果需要CoreData, 推荐看下:
    https://github.com/keithpitt/DKPredicateBuilder
    https://github.com/keithpitt/DKCoreData
    主要是查询的链式语法
    ewangke
        27
    ewangke  
       2013 年 2 月 5 日
    @myrual
    @alexrezit
    @PrideChung
    刚学的两个中文术语,我是指Reflection/Introspection,详见:
    http://www.mirageapps.com/whats-new/articles/introspection-reflection-and-swizzling-in-objective-c

    Model的例子,可以看看这个(需要你手写每个Model的类,这样才有compile time的checking):
    https://github.com/MugunthKumar/MKFoundation
    ewangke
        28
    ewangke  
       2013 年 2 月 5 日
    @ydhydh 我说的就是这个意思:)
    CoreData有些重,不喜欢
    ewangke
        29
    ewangke  
       2013 年 2 月 5 日
    想试试Core Data,可以用MagicalRecord
    https://github.com/magicalpanda/MagicalRecord
    ewangke
        30
    ewangke  
       2013 年 2 月 5 日
    @notedit 这种先实现后UI的方式,个人玩玩还行。
    做产品会死翘翘的,尤其在一个稍微大点(>=10?)的团队中。
    BigZ
        31
    BigZ  
       2013 年 2 月 5 日
    你想的太复杂了
    ios主要考虑UI展现和交互的问题

    千万不要自己写entity class,用list或者dict足以,要持久化存储就用plain 文件或者sqlite
    chisj
        32
    chisj  
       2013 年 2 月 6 日
    @ewangke 握手,我就是1和3结合,其实怎么快怎么简单就怎么用。
    写太多模式,反而复杂了,不喜欢。
    lldong
        33
    lldong  
       2013 年 2 月 6 日
    推荐GitHub的Mantle,轻量方便
    notedit
        34
    notedit  
    OP
       2013 年 2 月 10 日
    @lldong 最终选择了 AFNetworking + Mantle 的方案

    第一个版本先怎样简单怎样来了

    谢谢大家
    jackfan
        35
    jackfan  
       2013 年 2 月 11 日
    用core data是disaster
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2800 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 74ms UTC 13:18 PVG 21:18 LAX 06:18 JFK 09:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86