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-02-04 22:29:54 +08:00 · 6572 次点击
    这是一个创建于 4341 天前的主题,其中的信息可能已经有所发展或是发生改变。
    背景: 没有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-02-04 22:35:42 +08:00
    没懂楼主要做什么, 不过我觉得 Stanford CS193P 课程的第一课十有八九能解决你的问题.
    苹果官方的文档还是不错的, 用惯了他们的文档再搞 web.py 差点吐血三升. (于是至今不咋会 Python... =-=
    sivacohan
        2
    sivacohan  
       2013-02-04 22:59:45 +08:00
    @alexrezit 你可以问楼主flask
    alexrezit
        3
    alexrezit  
       2013-02-04 23:05:09 +08:00
    @sivacohan
    忘了之前在哪儿看到有人说 web.py 现在不怎么更新了所以推荐用 flask.
    前一阵儿我娘想学 coding, 我还极力推荐 Python 来着~ =-=
    sivacohan
        4
    sivacohan  
       2013-02-04 23:32:51 +08:00 via Android
    @alexrezit 最近咱父母都有逆袭的趋势啊!
    notedit
        5
    notedit  
    OP
       2013-02-04 23:53:38 +08:00
    @alexrezit 我是想求一个客户端数据层的设计方案
    notedit
        6
    notedit  
    OP
       2013-02-04 23:57:40 +08:00
    @alexrezit oc的基础我是知道的 我想从代码组织结构方面了解一些一个App的设计
    virushuo
        7
    virushuo  
       2013-02-05 00:01:46 +08:00
    restkit是个好东西。如果你的model能完全对上api模型,那么用restkit直接管理数据层没问题。但自己多少还是要明白Core Data的。

    另外restkit新版变化不小,要注意兼容问题。
    notedit
        8
    notedit  
    OP
       2013-02-05 00:04:37 +08:00
    @virushuo 能给一个开源的例子么 我在github没有找到最新版restkit复杂一点的例子

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

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


    另外我还没迁移到最新,新的情况我还不太知道(如果用了AFNetworking就是新版)
    notedit
        10
    notedit  
    OP
       2013-02-05 00:21:40 +08:00
    @virushuo 好的 多谢 另外你也是golang的爱好者 幸会
    virushuo
        11
    virushuo  
       2013-02-05 01:15:21 +08:00
    @notedit 哈哈,是啊。python我也挺喜欢,不过没啥正经地方用。
    Livid
        12
    Livid  
    MOD
       2013-02-05 01:18:43 +08:00
    你可以看看这个解决方案:

    http://www.parse.com/
    notedit
        13
    notedit  
    OP
       2013-02-05 01:47:33 +08:00
    @Livid 谢谢 之前用python的时候用过他们的服务 速度有些慢 而且偶尔会超时
    ewangke
        14
    ewangke  
       2013-02-05 03:24:15 +08:00
    @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-02-05 03:27:26 +08:00
    @notedit
    补充一下,上面我说的第四种方案,是最“酷”的方案。很多时候,这种方式非常方便(尤其是维护阶段)。
    但它最大的问题就是不直观,而且对工程师水平要求较高(大概比例是每100个Objective-C工程师,20个听说过这种方法,敢碰的不到5个,真正用好的能有一个就不错了)。

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

    能解释一下什么意思么?或者给个例子?
    sharpnk
        17
    sharpnk  
       2013-02-05 09:49:53 +08:00
    - 使用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-02-05 09:51:19 +08:00
    @ewangke 第四种方案是指利用KeyValueCoding自动生成property?

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

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

    我的应用相对小一些 可能你说的第三种方案最适合我 在建立model方面能不能给我一点代码看
    krafttuc
        23
    krafttuc  
       2013-02-05 12:25:47 +08:00
    我觉得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-02-05 15:16:54 +08:00
    @krafttuc 谢谢 我看一下
    ydhydh
        25
    ydhydh  
       2013-02-05 16:12:54 +08:00
    JSONModel 是个不错的选择
    https://github.com/icanzilb/JSONModel
    ydhydh
        26
    ydhydh  
       2013-02-05 16:16:42 +08:00
    如果需要CoreData, 推荐看下:
    https://github.com/keithpitt/DKPredicateBuilder
    https://github.com/keithpitt/DKCoreData
    主要是查询的链式语法
    ewangke
        27
    ewangke  
       2013-02-05 16:29:25 +08:00
    @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-02-05 16:30:23 +08:00
    @ydhydh 我说的就是这个意思:)
    CoreData有些重,不喜欢
    ewangke
        29
    ewangke  
       2013-02-05 16:41:51 +08:00
    想试试Core Data,可以用MagicalRecord
    https://github.com/magicalpanda/MagicalRecord
    ewangke
        30
    ewangke  
       2013-02-05 16:43:58 +08:00
    @notedit 这种先实现后UI的方式,个人玩玩还行。
    做产品会死翘翘的,尤其在一个稍微大点(>=10?)的团队中。
    BigZ
        31
    BigZ  
       2013-02-05 17:06:34 +08:00
    你想的太复杂了
    ios主要考虑UI展现和交互的问题

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

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

    谢谢大家
    jackfan
        35
    jackfan  
       2013-02-11 07:30:23 +08:00
    用core data是disaster
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4630 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 05:36 · PVG 13:36 · LAX 21:36 · JFK 00:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.