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
lincode
V2EX  ›  iDev

一个用于处理 View Controller 内部和外部调用的库: FRDIntent

  •  
  •   lincode ·
    lincode · 2016-10-30 09:30:04 +08:00 · 4113 次点击
    这是一个创建于 2944 天前的主题,其中的信息可能已经有所发展或是发生改变。

    FRDIntent :https://github.com/douban/FRDIntent

    使用 iOS 系统方法完成各 view controller 之间的跳转,各 view controller 会耦合得很紧。跳转时,一个 view controller 需要知道下一个 view controller 是如何创建的各种细节。这造成了 view controller 之间的依赖。

    iOS 系统还为各个应用间的相互调用提供了一种基于 URL 的处理方案。即应用可以声明自己可以处理某些有特定 scheme 和 host 的 URL 。其他应用就可以通过调用这些 URL 而跳转到该应用的某些页面。部分 URL Router 项目比如,使用这个机制通过调用 URL 来实现 view controller 之间的相互调用。这种方案存在一些问题,比如:

    • 传递复杂对象很麻烦;
    • 无法区分内部和外部调用。

    在 Android 中,这一问题得到了优雅的解决。这就是 Intent, Intent 是一个消息传递对象,用于启动 Activity 。 FRDIntent 是对 Android Intent 的一个模仿。当然,相对于 Android Intent , FRDIntent/Intent 做了极度简化。这是因为 FRDIntent/Intent 的使用场景更为简单:只处理应用内的 view controller 间跳转。在 FRDIntent/Intent 的基础上,我们在同一个项目封装了 FRDIntent/URLRoutes ,用于处理应用的外部调用。这样做其实是为了隔离了外部调用和内部调用,做这个区分会带来一些好处:

    • iOS 系统提供的通过 URL 调用另外一个应用功能本身就是使用在应用间的。 iOS 系统中,应用之间的隔离是清晰而明确的,通过 URL 在应用之间传递信息是合适的。但是,如果在应用内部调用也使用 URL 传递信息,就会带来诸多限制。 Intent 更适合内部调用的场景。通过 Intent ,可以传递复杂数据对象,可以较容易地定义转场动画。这些在 URL 方案中都很难做到;
    • 区分了外部调用和内部调用。我们就可以选择是否将一个内部调用暴露给外部使用。这就避免了在 URL 方案中,无法区分内部调用和外部调用,将本应只给内部使用的调用也暴露给了外部。
    10 条回复    2016-10-31 16:32:55 +08:00
    ldehai
        1
    ldehai  
       2016-10-30 09:58:10 +08:00   ❤️ 1
    从详情页返回数据,有没有优雅的方法。
    比如 UITableViewController ,到 detailViewController 去修改数据,改完了要回去刷新列表数据。
    几种常见的做法: 1 、 notification 2 、 delegate 3 、 block 。总觉得要写的代码还是有点多。
    zongren
        2
    zongren  
       2016-10-30 10:51:21 +08:00
    @ldehai 就这点代码还多。。
    再说你可以封装好啊
    iShawnWang
        3
    iShawnWang  
       2016-10-30 11:14:28 +08:00 via iPhone
    @ldehai 同求优雅的解决方案...
    ldehai
        4
    ldehai  
       2016-10-30 11:17:53 +08:00
    @zongren 或者加个 Category
    lincode
        5
    lincode  
    OP
       2016-10-30 11:31:51 +08:00
    @ldehai FRDIntent 提供了一个优雅的方法: startControllerForResult 。这是对 Android 的 startControllerForActivity 的模仿。 FRDIntentDemo 中 https://github.com/douban/FRDIntent/blob/master/FRDIntentDemo/MainViewController.m#L78 对如何使用做了展示。
    ldehai
        6
    ldehai  
       2016-10-30 11:58:45 +08:00
    @lincode 谢谢,看到了,是用 delegate 实现的
    jesse_luo
        7
    jesse_luo  
       2016-10-30 13:40:52 +08:00
    赞,不过 FRDModuleManager 并没有开源的样子
    lincode
        8
    lincode  
    OP
       2016-10-30 20:00:12 +08:00
    jesse_luo
        9
    jesse_luo  
       2016-10-30 21:56:20 +08:00
    @lincode 嗯,后来在那篇文章里看到啦
    kitalphaj
        10
    kitalphaj  
       2016-10-31 16:32:55 +08:00
    想要优雅可以用 unwind
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2990 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:10 · PVG 22:10 · LAX 06:10 · JFK 09:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.