您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>源码下载>通讯/手机编程>

iOS 开发中的自我管理模式

大小:0.3 MB 人气: 2017-09-26 需要积分:1

  使用这个控件的人只需要调用这个 configure 方法就可以配置入参和事件处理。但随之而来的就是一些蛋疼的问题:

  configure 的调用者是 superview,上面的例子中也就是一个 UITableViewCell,但 Cell 这层并不知道自己的 ViewController 是谁,于是乎还得向上一级传递这个点击事件,直到能获取到 NavigationController,然后 Push 一个用户信息的页面。

  这个 Avatar View 在 App 的各个地方都可能粗线,而且行为一致,那就意味着事件处理的 block,要散落在各个页面中,同时也带来了很多“只是为向上一层级转发事件”的 “Middle Man”

  为解决这个问题,就需要给这个 View 放权,让其自己 Handle 自己的事件,也就是 Self-Managed,为了不破坏 View 的纯洁性,比较好的实践是在 Category 中实现:

  @interface?FDAvatarView?(FDAvatarViewSelfManager)

  -?(void)selfManagedConfigureWithAvatarURL:(NSURL?*)URL?VIPInfo:(id)info?uid:(NSString?*)uid;

  @end

  实现时最好要调用 View 主类提供的 API:

  @implementation FDAvatarView (FDAvatarViewSelfManager)

  // 为后一个页面的创建增加了个 UID 参数

  - (void)selfManagedConfigureWithAvatarURL:(NSURL *)URL VIPInfo:(id)info UID:(NSString *)UID {

  [self configureWithAvatarURL:URL VIPInfo:info tapped:^{

  // 假设 App 结构是 Root -》 TabBar -》 Navigation -》 ViewController

  UITabBarController *tabBarControler = (id)[UIApplication.sharedApplication.delegate.window.rootViewController;

  UINavigationController *navigationController = tabBarControler.selectedViewController;

  // 创建用户信息 View Controller

  FDUserProfileViewController *profileViewController = [FDUserProfileViewController viewControllerWithUID:UID];

  [navigationController pushViewController:profileViewController animated:YES];

  }];

  }

  @end

  这里用到了类似 AOP 的思路,添加了对 App 层级的耦合,如果觉得这样的耦合方式不妥的话,也可以封装个全局方法去取到当前顶层的 Navigation Controller。

  这样,FDAvatarView 的调用者只需要配置入参,其余的它自己全能搞定了,即使 App 内很多处出现头像,逻辑代码也只有一份。

  接下来再来个例子:

  iOS 开发中的自我管理模式

  这个点赞的按钮功能上有几个职责:

  显示已有的点赞数

  点击按钮后执行一个小动画,点赞数 +1,同时发送网络请求。

  若已经点赞,点击执行反向操作

  若网络请求发送失败,则回退成点击前的状态

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!