BBSSDK论坛移动化实现方案

简介:

一.产品介绍

BBS是一个论坛SDK项目,用户通过简单的几句代码就可以集成整个论坛模块.项目通过模块化开发,多个模块功能分离,用户可以选择需要的模块进行集成.

二.BBS整体结构

BBS的整体结构如下图所示:
_1

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分为简约版和时尚版两个版本,各自的主界面如下图所示: 简约版首页论坛模块
_2

时尚版首页论坛模块
_3

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

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

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

四.源码解读

开屏策略

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

/**
 获取全局配置
 
 @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);
        }
    }];

主界面上滑左右滑效果

_5

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

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

_6
可见,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");
    }
}

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

目录
相关文章
|
3月前
|
缓存 算法 Java
首次公开!阿里巴巴最新高并发架构设计实录被我从Github扒下来了
前言 现在Java面试,问的是越来越底层。作为一名合格的Java程序员不仅要能“上天”,还要能“入地”!上天是指高并发,缓存,大流量,大数据量,能在更高的层面解决问题,入地是指从JVM,OS,算法,线程,IO这块刨根究底,对底层知识都能知其然还要知其所以然。 而本篇要跟大家探讨的就是“上天”这块的内容。据有关数据表明,现在基本工作年限超过5年的Java开发岗以及各大厂招聘岗位,对于这块内容是必定会考察的。这也就意味着,你想要在今年这个大环境下,找到一份薪水高且发展前景好的岗位,不关基础知识还要有良好的编码习惯和能力、排查问题、解决问题的能力以及整体系统的设计能力和架构能力。
121 1
|
SQL 运维 负载均衡
【6月23日直播预告】携程OcenanBase 实践数据库发布和拟真压测
6月23日(周四)19:00,将线上播出《深入浅出OceanBase第五期》,将带来携程OceanBase实践数据库发布和拟真压测,欢迎大家及时关注。
|
关系型数据库 分布式数据库 数据库
2022首届阿里巴巴开源开放周来了!数据库分论坛精彩内容曝光!
2022首届阿里巴巴开源开放周来啦!数据库分论坛有哪些精彩内容呢?请看本文。
2022首届阿里巴巴开源开放周来了!数据库分论坛精彩内容曝光!
|
运维 架构师 关系型数据库
阿里巴巴招聘官方认可的数据库认证特训营重磅来袭!
本次训练营,面向数据库管理员、架构师、开发者、运维人员,以及对数据库技术感兴趣的高校学生等,通过数据库ACP认证,还可尊享阿里云数据库优先就业通道。
349 0
|
设计模式 Java Python
“问道”论坛上线了
“问道”论坛上线了
211 0
“问道”论坛上线了
|
数据库
2021阿里云峰会|【全链路数据服务-数据库】分论坛火热报名中
新思路、新策略、新产品、新方案,为您展开“云上创新”的全景图。
624 0
2021阿里云峰会|【全链路数据服务-数据库】分论坛火热报名中
|
存储 测试技术 视频直播
直播报名中!首次公开OceanBase征战TPC-C测试技术细节全解析
OceanBase技术直播间是OceanBase为用户和技术爱好者带来的系列技术直播课程,由蚂蚁金服一线技术专家分享最全面的理论知识和最实用的技术实践,内容包含数据库内核系列、手把手实操系列和最佳实践系列等。
直播报名中!首次公开OceanBase征战TPC-C测试技术细节全解析
|
数据库 数据库管理 容灾
|
运维 安全 关系型数据库
解析日活从0到千万的数据库架构演进,揭秘阿里自研数据库原理:一线案例,不可错过!
8月24日,阿里云数据库技术峰会到来,这是云栖社区第12届在线技术峰会。本次技术峰会邀请到阿里集团和阿里云数据库老司机们,为大家分享一线数据库实践经验,讲干货,讲思路,欢迎预约直播。 下面给大家做下议题及嘉宾介绍,相信看后定会让你动心!
11043 0