一.产品介绍
BBS是一个论坛SDK项目,用户通过简单的几句代码就可以集成整个论坛模块.项目通过模块化开发,多个模块功能分离,用户可以选择需要的模块进行集成.
二.BBS整体结构
BBS的整体结构如下图所示: 

BBS由三大核心模块组成:MOBFondation.framework,BBSSDK.framework,BBSSDKUI.framework.

MOBFondation.framework是公有framework,里面封装了一系列通用的功能模块,比如获取设备信息,加解密,Native和js的桥接,网络处理,数据解析......

BBSSDK.framework是数据framework,内部封装了所有数据接口.BBSSDK.framework可以独立作为SDK进行使用,只需要自己写UI,调用BBSSDK.framework,就能够实现论坛项目的开发.不过由于BBSSDK.framework引用了MOBFondation.framework,所以在使用BBSSDK.framework时,需要添加MOBFondation.framework.

BBSSDKUI.framework是对界面的封装,它以BBSSDK.framework为接口,穿插MOBFondation.framework的使用,包装成一个完整的论坛UI模块,开发者集成这个framework,可以通过简单的几句代码实现BBS的接入.

ShareSDK和MobLink通过弱引用的方式实现了BBSSDKUI的拓展,通过ShareSDK实现了对分享功能的支持,通过MobLink实现了对网页跳转App的支持.对于如何实现的弱引用,下文会有涉及.

三.BBSSDKUI功能解析

BBSSDKUI分为简约版和时尚版两个版本,各自的主界面如下图所示:

这两个版本除了展示效果的不同,功能完全一致.简约版注重UI的简洁,界面清晰利落.时尚版追求UI的炫酷,里面实现了很多毛玻璃,动画等效果.具体选择哪个版本,依据不同业务需求而定.

主界面展示了论坛和门户两大模块.这两个模块实现不同业务功能,但并不一定全部展示.展示哪个模块由后台决定,用户可以通过后台进行手动配置.

我们看一下BBSSDKUI的功能结构:

四.源码解读
开屏策略

开屏策略提供了全局必要配置,通过调用如下接口实现:

/**获取全局配置@param result 回调*/
+ (void)getGlobalSettings:(void(^)(NSDictionary *settings, NSError *error))result;复制代码

由于开屏策略必须在调用其他接口之前完成,所以这里使用了信号量进行控制: 在时尚版的BBSUIHomeViewController里,

 self.semaphore = dispatch_semaphore_create(0);self.queue = dispatch_queue_create("HomeViewControllerQueue", DISPATCH_QUEUE_SERIAL);dispatch_async(_queue, ^{//阻塞线程,直到获取配置信息完成之后dispatch_semaphore_wait(self.semaphore, DISPATCH_TIME_FOREVER);});[BBSSDK getGlobalSettings:^(NSDictionary *settings, NSError *error) {if (!error && settings){......dispatch_semaphore_signal(self.semaphore);}}];复制代码

主界面上滑左右滑效果

在时尚版的主页以及时尚版的个人中心,我们从上面的图中可以看到,tableView可以左右滑动,也可以上下滑动.当TableView左右滑动的时候,其"header"不会跟着滑动,而当TableView上下滑动的时候,其"header"会跟着滑动.这种效果是怎么实现的呢?

我们先看看这种效果的UI结构:

可见,UI大致是通过上下两个ScrollView实现的.最外层的ScrollView用来切换各个子视图(TableView).内层的ScrollView(即TableView)上下滑动.表头其实是一个UIView,通过监听TableView的contentOffSet,对表头进行Frame设置.

BBSUIPortalViewController:/**这里通过封装将TableView的实现集成到BBSUIThreadListViewController里,通过block的方式拿到contentOffSet*/
for (BBSPortalCatefories *obj in self.categoriesList) {BBSUIThreadListViewController *vc = [[BBSUIThreadListViewController alloc] initWithCatid:obj.catid allowcomment:obj.allowcomment];vc.viewType = BBSUIThreadListViewTypePortal;[vcs addObject:vc];[titles addObject:obj.catname];vc.offSetBlock = ^(CGFloat offSet){//                    NSLog(@"==============  %f",offSet);[self setContentOffSet:offSet];};vc.refreshBannerBlock = ^(NSArray *bannnerList, NSError *error) {[self _refreshBannerWithBannnerList:bannnerList error:error];};
}复制代码
/**进行表头Frame的处理*/
- (void)setContentOffSet:(CGFloat)offSet
{CGRect frame = self.headerView.frame;frame.origin.y = -offSet + _iphoneXTopPadding;self.headerView.frame = frame;_lastTableViewOffsetY = offSet;// 考虑到segmentBar,在到达navigationbar位置的时候,segmentBar需要"悬停"if (offSet <= 245 - 64){CGRect segmentFrame = self.segmentControl.frame;segmentFrame.origin.y = 245-offSet + _iphoneXTopPadding;self.segmentControl.frame = segmentFrame;}else{CGRect segmentFrame = self.segmentControl.frame;segmentFrame.origin.y = 64 + _iphoneXTopPadding;self.segmentControl.frame = segmentFrame;}if (self.offSetBlock){self.offSetBlock(offSet);}
}复制代码

弱引用的实现

BBSSDKUI对ShareSDK和MobLink采取弱引用的集成方式.在集成BBSSDKUI.framework的时候,即使不添加ShareSDK和MobLink这两个模块,也不会报错,只不过相关的功能不能使用而已.这和对BBSSDK.framework和MOBFondation.framework的强依赖是不一样的.

怎么实现的呢?

在项目初始化的时候,MOBFondation会通过hock的方式拿到所有的类名,在使用这个SDK的时候,通过协议的方式间接拿到这个类,然后通过私有方法进行调用.

- (void)_authLoginWithType:(NSInteger)type
{......NSArray *components = [[MOBFComponentManager defaultManager] getComponents:@protocol(IMOBFShareComponent)];if (components.count > 0) {id<IMOBFShareComponent>  ShareComponent = components[0];if (ShareComponent && [ShareComponent conformsToProtocol:@protocol(IMOBFShareComponent)]){[SVProgressHUD show];[ShareComponent authorize:authType settings:nil onStateChanged:^(NSInteger state, id<IMOBFSocialUser> user, NSError *error) {......}];}}else{NSLog(@"没有接入ShareSdk");}
}复制代码

这种方式避免了强依赖导致的高耦合,在接入过程中,可以选择性的接入需要的组件,不需要的组件可以不接入,但也不会报错.

BBSSDK论坛移动化实现方案相关推荐

  1. android组件化架构 书,Android MVVM组件化架构方案

    MVVMHabitComponent 关于Android的组件化,相信大家并不陌生,网上谈论组件化的文章,多如过江之鲫,然而一篇基于MVVM模式的组件化方案却很少.结合自身的调研和探索,在此分享一篇基 ...

  2. .NET Core开发实战(第14课:自定义配置数据源:低成本实现定制化配置方案)--学习笔记...

    14 | 自定义配置数据源:低成本实现定制化配置方案 这一节讲解如何定义自己的数据源,来扩展配置框架 扩展步骤 1.实现 IConfigurationSource 2.实现 IConfiguratio ...

  3. 高度可定制化的方案_如何开发高度可定制的产品

    高度可定制化的方案 您是否听说过:"我们非常喜欢您的产品--除了一些小细节."? 然后,CIO推出了一系列其他"必备"要求的清单,其中有数百个要添加到您的惊人产 ...

  4. java saas_应用系统的SaaS化的方案讨论

    应用系统的SaaS化的方案讨论 文/阿蜜果 日期/2012-11-26 1.SaaS的概念 SaaS是Software-as-a-service(即服务)的简称.SaaS在业内的叫法是,或称软营.是一 ...

  5. 基于Small及Weex的定制化APP方案

    前言 small是android与iOS平台比较出名的轻巧的跨平台插件化框架,也正是被这一点吸引,决定将small应用到集团内部的应用引擎模块化方案中,本篇博文主要讲述本人基于small在androi ...

  6. 非结构化数据处理方案

    非结构化数据&结构化处理方案 一. 非结构化数据处理需求    企业拥有的非结构化数据增长迅速.非结构化数据是计算机或人生成的信息,其中的数据并不一定遵循标准的数据结构(如模式定义规范的行和列 ...

  7. ubuntu一键化部署方案

    ubuntu一键化部署方案 近来对于开发的项目进行部署,每次都是先下载相关的软件,拷贝的指定的位置然后解压,配置path,将工程拷贝到指定的位置修改相关度额配置文件,十分麻烦和费时,能不能把事情尽量简 ...

  8. discuz 生成静态html,Discuz论坛静态化设置方法

    URL静态化可以提高搜索引擎抓取,Discuz论坛程序是如何实现URL静态化的呢? 为给大家提供发布问题.解决问题.分享经验的平台,本站现已开启经验交流区(基于Discuz论坛程序). 刚使用Disc ...

  9. 以太坊核心开发者计划为2.0制定“最小化合并”方案

    3月12日消息,以太坊核心开发者Mikhail Kalinin在以太坊2.0技术规范中发表关于将以太坊1.0合并至2.0的讨论稿(WIP),他和DannyRyan在最近的一次以太坊2.0会议中讨论了该 ...

最新文章

  1. OpenGL环境搭建
  2. 4、SpringBoot 配置和使用定时任务
  3. linux使用pyodbc和freetds连接sqlserver
  4. Flink 在有赞的实践和应用
  5. java数据结构队列杨辉三角_数据结构之队列——输出杨辉三角形
  6. python2和python3的默认编码_Python2和Python3中的字符串编码问题解决
  7. 25 亿条/秒消息处理!Flink 又双叒叕被 Apache 官方提名
  8. cmd简单代码雨实现方法
  9. sqlite和MySQL一些常用命令_sqlite3常用命令语法
  10. ERROR ITMS-90022 ERROR ITMS-90096
  11. fiddler抓手机APP包(安卓)
  12. 练习---打印出电影天堂中电影的下载链接
  13. 自动化爬取淘宝数据--(保存到文本中)
  14. nvm-windows下载与安装
  15. gpu虚拟化云服务器,gpu云服务器 虚拟化
  16. 使用scoop下载Annie时提示couldnt find manifest for annie
  17. 2345手机软件下载
  18. OSP 与 Session
  19. android 日历
  20. winxp搜索网络计算机,WinXP系统上的计算机打开WiFi搜索后无法找到无线网络的问题的解决方法...

热门文章

  1. vue 动态设置背景图片
  2. 如何设置顶部和底部固定,中间填满
  3. mysql 全连接查询合并字段
  4. 人工机器:Jetson Nano 安装Qt5
  5. Android: 生成安卓可使用的Tflite文件
  6. Haar、pico、npd、dlib等多种人脸检测特征及算法结果比较
  7. @description iPhoneX炫彩渐变背景实现
  8. 28.Node.js 函数和匿名函数
  9. Python之Idel利器jupyter notebook
  10. Visual Assist X插件