面包时间


2017.02.22

可以练习,每当这个时候,脑袋就犯困,我这脑袋真是神奇呀,一说让你做事情,你就犯困,你可不要太过分啊,我可是给了你足够的睡眠时间,你过分了,分分钟弄死你呀有木有,赶紧给老子好起来,否则灭了你。

一说到视频的封装,其实现在最大的为问题是目标不明确,好啊,现在我的目标就是搞明白我的目标是什么,这个没弄清楚,弄啥也是白搭呀,必须得搞清楚搞明白我的最终目的是啥,就是腾讯视频的二次封装,那么问题来了,到底封装成什么样子,一点也没有概念,最好的就是造一个跟QQ空间内嵌直播一模一样的东西,一说到直播,就是好多的名词摆在我的面前,视频录制,视频直播、互动直播、视频渲染、登录注册、游客身份、单机礼物、特效礼物、观众私聊、红包互动、聊天室群聊,更重要的是,我是要一做我不擅长的事情, 大脑你就犯困,你是不是想死,我现在做一件很重要的事情,大脑你长点心好么?如果这件事情干不成,我将无法提现我的价值,必须高度重视起来,今天我需要看到明显的进步,这个进步,最重要的一点就是知道我一版本的最终目的,同时将行动方案制定出来,让我知道应该做什么。最终目的是什么样子?这是我心中的一个大大的疑问,要求是别人使用九合ID直接使用我们的SDK,那么腾讯SDK正常使用的前提都需要传入哪些参数?典型的用哪一个APP应用的key和AppID号去开启SDK?

明确目的方向之后,制定行动方案,典型我现在能够想到的需要通过大量阅读来解决的问题包括:静态库、腾讯SDK、ToTolk、封装架构、行动方案、gitHub、简书类似、模块抽离、今上午就是把行动方案制定出来,不然就别吃饭了,这是硬性规定,现在眼前该做啥,古国你找不到该做啥, 那你就被工作了,卷铺盖走人吧,反正你这么没用,可长点心吧,孩子,你怎么能够找不到进步的阶梯呢,今天就把行动方案拿出来,让后交给提审,然后每一步都必须要在掌控之中, 上午必须把行动方案拿出来,不然根本就是没有机会,所以还是简单点吧,必须上午明确两个问题,第一就是达成的目标是什么?第二就是如何达成这个目标?需要多少时间,这个太重要了,必须得抓紧时间了,第一个问题达成什么目标,我怎么啦描述我要达成的目标呢,或者说我达成的目标对与别人有什么用,换成了别人怎么使用我的SDK,别人使用的就是九合ID来跟别人的九合ID视频直播,就相当于一个微信呀,只是我不要做两方,这是不是简单很多呢?就按照微信视频来举例,还是拿QQ空间来举例,反正就是能够直播,就说发送直播的这一方,就是一个按钮,然后决定了所有的逻辑。刚刚玩了一下QQ空间的直播,直接就是按钮点击、present直播控制器、设置标题、设置封面、下面摄像头翻转按钮、正式开始直播、

我的行动方案就是很简单、首先设置控制器、present直播预览控制器、直播预览控制器示例直播逻辑的使用、传入标题和封面图两个参数作为直播逻辑的一部分、这可是我长脸的好机会,我的代码将会被高手阅读呢,所以必须融合一些先进的东西,典型入滤镜和动效,QQ空间的直播的动销做得是真好啊,看到QQ空间的直播动效,自己根本就没有了继续学习的动力了,好吧,这肯定有人造轮子,拿来主义也不是什么难事,开启直播的处理逻辑其实特别简单呀,就是一个简单的开始直播,然后倒计时,接着就是直播封面和直播标题构成的左上角简介View、观众人数Lable、点赞数Lable、主播等级Lable、分享Button、结束直播Button。

越想越觉得这件事请的价值巨大呀,毕竟我做得事情大家都是看不出来的,我现在要做的就是一个超级好的展示自己的机会,把自己过去一年的成果以一种最简单的方式站西拿出我最复杂的逻辑,这样大家就都会认识到原来直播的真的不是那么简单的,这样大家就会高看我一眼了,我也就是嘛,如果不整理成一个Demo,大家也根本不知道我过去一年都做了啥呀,还有,自己其实一直也有这个想法嘛,就是把我过去的成果以一种最简洁的方式呈现给大家,说白了,我就做一件事情,让直播App值保留最最核心的一部分,其余的全部做减法,甚至,我想要的就是一个微信群视频那样的效果,谁选哪个这么,一个场景,我设置封面设置标题开始直播,所有关注我的人都会和收到我的LeanClound私信,这个私信就包含进入我直播间的所有信息,包括房间号,聊天室号,这样只要对方是登录状态,就能够一步进入我的直播间,甚至在后来,我可以扩展这一功能,将邀请看直播变成邀请互动直播,如此一来,我过去一年所有的努力就都串起来了,那时候,大家就可以看到我的成长和代码实现逻辑,而不用像现在这样,必须看很多一些排名或是个人中心的逻辑,直接进入最核心的东西,所以说我的目标很明确呀,就是我要把过去一年对直播做出的努力串起来,让大家一眼以最小的成本看到过去的努力,最好再能够融入一些最新的写法,包括微信小视频录制和RAC+MVVM架构和动效和滤镜。刻意训练,原来这么有效,我如此一下子就找到了我下一步的方向,而且这一条路,直指去年一年的核心工程,简直棒棒的。所以什么静态库,我根本就是反感,好么,我要做的事情是,把过去一年写的直播逻辑以最简单的方式呈现给大家,让大家看到我做的事情的价值所在,还有比这更重要的么?绝对没有,那么行动方案是什么?就是根据去年的成长逻辑,一步一步抽离出来,不能再凭空书写了,必须把心得写进Xcode里,这样就可以搞定行动方案了,我不知道什么对什么不对,但是我知道第一步就是搭建框架和架构,把自己的逻辑按照摄像头预览、发直播、发消息、点赞、普通礼物、美颜、动效、滤镜、分享、私信、发红包、特效礼物的逻辑一个一个得进行梳理。哈哈,打开Xcode就什么都明白了。

今天下午也过完了,悟出一个道理,如果自己没有目标感,做事情的效率特别低,不见得你做得慢就一定好,你知道么,把一件事情做成有趣的最好方式就是能够清晰自己的目标感,绝不半途而废,

2017.02.23

刻意训练,必须努力做到,今天上午我的目标是什么,自己给自己找目标,昨天已经搞定了直播的发布,今天上午的目标是添加标题、添加封面、切换摄像头方向、默认开启美颜、然后点击正式直播、开启倒计时、直觉告诉我这些都不是当下最重要的任务,当下最最重要的任务又是什么呢?肯定的,这么好的太阳,我居然想到老家,故土难忘,现在我要知道今天上午的计划呢,我发直播成功后,最重要的就是能偶看直播还是说直接打开LeanClound来发送消息,孰轻孰重,如何判断,居然又想睡觉,尼玛,你要知道昨晚睡眠很充足,好吧,那现在做什么呢,做什么呢,做什么呢,做什么呢,现在我就首先把 Bug问题解决掉!如果真的好不到事情做,那你就别干了,真的如是,尼玛,这都搞不定,这个很难么,就是简简单单的一个创建房间有什么难的,怎么就开不开摄像头呢,尼玛,说什么打不开摄像头,这完全不科学呀,我反正是相信的。还打不开摄像头,这是什么大问题么,肯定不是,那这个问题出在哪里,我的去查找错误码,可是我最害怕做的事情就是去查找错误码,今天上午不把这个问题解决掉,就别吃饭了。说道做到。今天真的是太郁闷了,自己也没有做什么不对的事情,看来必须走上商业的市场,才是我的未来,我知道自己要做什么但是,又是失望了自己要做什么,确实自己能把当下的事情做好,但是已经渐渐地少了那一份热情,这不是我想要的,接下来可能我真的需要好好想想我的未来了。

2017.03.06

上周已经把左右的API搞定,也就是数据没有问题了,今天需要做的就是一次性搞定所有的评论和回复界面

首先做的是事情是调整TopView的按钮位置,然后以最小的成本,那当然就是通过写类别了,在UIButton里面再写一个构造Button的方法,这个Button就是TopView的布局。

TopViewButton的frame布局。设置titleLabel背景颜色、设置imageView背景颜色、设置titleLabel大小、设置imageView大小、设置文字空隙和图片空隙。

顶部按钮设置完毕,请求所有评论。控制器ViewWillAppear时设置默认选中消息Type为评论、viewModel发送虚假按钮点击信号然后执行网络请求、以Type为键从缓存字典中取出当前Type的dataSource、判断dataSource为空、执行网络请求、

网络请求数据,首先弄一个本地数据,避免建立网络引擎,更快呈现页面。首先API过滤我想要的评论数据然后本地化。建立空文件,然后复制粘贴data,本地读取刷新。

所有评论是一个数组作为键值对的字典。现在已经获取到了数组,首先更新缓存字典里面此Type对应的数组,然后判断tableView的mj_header的isRefreshing,调用方法endRefreshing。

通过RACObserve的方法绑定将ViewModle的dataArray的新值同步到TableView的dataArray属性。这就想当与重写了tableView的dataArray属性的set方法,然后在这个setDataArray方法里reloadData。

现在构建Cell的Xib界面。

现在我需要理清API的问题。唯一可以确定的就是视频详情这个接口了, 其余的都好乱,因此必须先做视频的上传和详情,然后才有下一步,否则好乱。现在就先写假数据把。

现在我需要搞一个高度自适应的Cell,首先要做的就是Cell高度不能确定,然后cell的高度需要提亲计算Lable的高度,然后让Cell的其余高度+Lable高度=cell最后高度。那么我现在需要做的就是不能把Cell的高度定死了,然后让Lable的高度能够自由拉升,这就可以了。

现在我已经处理好了两个Cell,进行不同模型区分加载不同Cell,初步想到将Cell的类型封装到Model的一个属性里。问题关键是这一步我该在什么地方来进行呢?当我按照点击按钮的类型获取到DataArray数组之后,然后装换成模型,问题是我该如何拿到遍历每一个模型然后把cellType装进去。

现在考虑是否建立一个baseCell,目的是调用父类声明,子类实现的refreshCellWithModel方法,而且以后如果用代码来写Cell更有优势,只是现在不建立基类就无法父类指针指向子类。除非变换父类指针成子类指针。

现在才发现,原来那个请求不到本地数据,是因为本地数据根本不能以:冒号的形式来表达键值对,必须以=号来表达键值对,说白了,只能识Xcode打印的数据。所以,创建API吧!评论API.

现在我已经用网络请求成功请求下来了所有视频id为13703的评论,同时把网络请求到的数据打印下来存到了本地。现在就是找一个有回复的接口。

哇塞,好厉害,我原本是在View里面创建一个subject热信号,然后当按钮点击的时候把按钮事件转变成热信号,同时控制器订阅这个热信号,然后在接收到热信号的时候,将这个时间发送给ViewModel的冷信号,其实哪有这么麻烦,直接通过RACObserve建立viewModel冷信号与View热信号的联系,只要View的Button被点击,热信号就被触发,冷信号就监听到热信号被触发,就开始逻辑计算,根本就不需要控制器什么事儿。太棒了。

在处理动态Cell高度之前, 有一个问题,就是我不明白,为什么每次RACommand都创建了两个信号,这不科学,是因为懒加载的原因么,哈哈,问题解决了,通过直接return所创建的信号的方式,发现瞬间信号只还行一次了,更重要的是,我发现不知不觉做了一个特别好的缓存也,就是一个type为键,数组为值的字典来保存上次请求到的数据,哈哈,太棒了。

遇到一个小问题,我设置了按钮的选中模式和非选中模式,当我将B置为选中模式,我希望其余按钮都是非选中模式,直接一个比例就可以了。很简单嘛,一个For遍历就搞定了,让每一个按钮在点击之前让所有按钮处于非选中状态。使用viewWithTag的前提居然就是tag不能为1、2、3这样太小的数,否则只是取到了父视图,原因苹果保留小tag。

现在处理高度自适应的,首先处理评论高度自适应吧,首先计算Lable高度,存入模型的高度属性之中,然后用固定高度+Lable高度=Cell高度。第一种环信的方法:在返回Cell的高度的回调方法里,首先将要显示的Text字符串传递cell.Lable.text属性,然后通过提前实例化的ToolCell调用对象方法返回Cell固定高度+Lable赋值结束后的高度,实现的关键环节就是先text赋值,后layoutSubview,最后返回新高度。第二种遍历的方法就是提前记录好Cell的高度并存入Model的cellHeight属性之中。但是在Lable的高度之前有一个巨大的前提,就是我必须得知道我的具体Lable呀,当我在viewModel里面给model的cellType遍历赋值的时候,根本不知道具体的Cell的具体Lable,所以啦,还是先给cell的可变Lable赋值然后layoutSubview再返回新高度吧,而且这里面有一个巨大的坑,就是一点得知道Cell的宽度。否则计算高度严重不准确。

好,现在正是采用第一种layoutSubView的方法来计算Cell高度,很简单,就是一个95+Lable高度。首选给Cell的可变Lable赋值。当我给Cell的Lable赋值之后,调用layoutIfNeeded并没有出现我想要的那种更改Lable高度,所以问题可能出在内容没更新上。字体确实是赋值到Lable上了,但是Lable的高度没有因为layoutIfNeeded而自动调整高度,那我现在不给Lable赋值文字,可能还是70的高度,原因就是我并没有真的更改掉Cell的ContentLable的内容,绝对是的,坑定还是我最初写的哪些问题支撑着这个70的高度,不信在layoutIfNeeded方法前打印Lable.text。果然如此,为什么给Cell的contentLable赋值不成功呢?还是我原本的内容,唯一的原因就是Cell复用了。

现在发现也不是content.text没更新的问题,更大的问题是可能适配不对,造成layoutIfNeeded方法无法生效,所以去看一下环信的约束。对比我的约束,差就差在:1、环信就一个上、左、最大允许宽 2、我的就是左右上下通通都固定了,所以把下边去掉,下边的间隙通过95固定宽度来搞定。哈哈,这样果然奏效。牛逼!

现在再设置一下回复的动态高度。既有回复Lable又有评论Lable,而且两个都是动态变化的,那么闲在先不管回复,先把评论搞定。

2017.03.08

解决昨天的小视频历史遗留问题,就是相册第一张图片的问题,简直坑爹了.

首先结局相册控制器的cancel事件,然后然相册控制器收回。然后就是视频的铺满Button的,因该是设置背景图片才对,然后开始录制和结束录制时的上传和相册按钮切换,还有就是点击开始录制时的精度条和时间更新,这都是需要处理,还有当我结束录制时并没有播放视频,这就有问题,好吧,问题一点点解决,首先结局录制状态和非录制状态的UI状态。录制状态相册默认显示,只要衶情况不像是,就是开始录制到结束上传这段,既可能是录制状态又可能是非录制状态,但是开始录制状态肯定是隐藏相册。

现在我需要更新时间,然后根据录制时间于设定时间的比值确定进度条长度,直接把录制的描述更新到Lable上,第一步就是录制开始时获取时间戳,然后一秒回调一次,最好的方法不如直接在ViewModel里面开启一个定时器,然后改变ViewModel的一个属性,然后控制器订阅ViewModel的这个属性,自然就更新Lable了。不要搞什么回调,很麻烦的。

既然想到了通过订阅ViewModel属性值来更新Lable和进度条,那直接订阅RecordEngine里面的属性来更新数据,这多划算。

现在更新Lable成功了,就是一个把事件戳转变成NSdate形式。现在出现的受压哦问题是点击技术按钮但是没有播放录制的视频。当我点击停止录制的时候,确实是停止了计时和关闭了定时器,但是进度条没有显示。

为什么现在我把这个URL传给player,player却不播放呢?原来构建NSURL有两种南方是,一种是fileURLWithPath另一种是URLWithString。前者本地,后者远程,当然不一样啦。

你当我点击取消按钮的时候,其实我是想重头开始,一下子把左右的都删除,然后重拍,那么这个时候,需要做的就是左边取消,右边相册,刚才弄这么负责,还弄了一个isRecord属性,哪有这么麻烦,直接监听record按钮的selected属性不就可以了么?

有一个奇怪的问题,当录制时间超过180秒的时候,遇到了死循环,我发信息给录制引擎结束录制,发现连isRecording属性都是空的,这就造成死循环,外部说关闭录制,但是内部却已经是无法判断关闭状态了,就根本关不了,什么原因呢?就是因为我点击重拍出了问题,正在录制,我点击了重拍,

重拍的逻辑问题很大,其实与上传唯一的区别就是不上传而已罢了。

现在当我正在播放视频的过程中,我关闭了播放层,但是没有到达我想要的视频捕捉层,我就想知道什么地方删除了视频捕捉层。

首先就是弄明白编码的问题,编码包括:1、将捕获的视频图片帧打包成NSData 2、停止视频的编码 3、

开始捕捉和结束捕捉只是一个session的问题,至于结束录制,就做3件事情,1、暂停编码 2、停止编码后存入相册和获取第一张图片 3、关闭定时器

开始录制:1、开启捕捉 2、开启编码 3、开启定时器

结束录制: 1、关闭捕捉 2、

当我把视频预览层在viewDidappear处消失,在viewWillAppear出添加,这就是问题大了,如何只添加一次呢,如果自然添加写在viewDidload里,尺寸写在viewWillAppear里

当关闭捕捉时,我想禁用闪光和摄像头按钮。其实就两种状态,一种是播放状态,另一种是预览状态,只是让播放状态不可点击。

现在还有一个问题,就是用户多次点击,暂停按钮会造成来回切换,我需要点击暂停之后结束然按钮不可点击,还有判断录制的视频是否大于3秒,小于三秒直接取消录制

大于3分钟直接结束已经得到验证了,是可行的。

好思路,按钮点击、改变selected属性、RACObserve监听此属性执行不同逻辑。

视频小于3秒,点击了停止,执行取消录制逻辑、大于3秒,执行停止录制逻辑。

突发奇想,觉得贝塞尔曲线来绘制进度条,其实特别好,展示我动画的时候到了。无论如何,改变按钮的selected属性。

当我重拍,其实我也需要像上传一样删除本地的视频吧。哦,没有删除本地文件,只是删除了压缩后的文件。

在研究上传视频之前,我先从本地提取视频,正好验证使用RAC处理回调是否需要委托代理声明

当我有新的视频录制成功,我直接就把这个新视频显示到右下角。

2017.03.09

今天必须完成视频的上传,研究腾讯视频的视频的上传,唯有如此,才能找到下一步的方向,考虑到上传视频必须依赖于腾讯SDK,所以有必要等一等,等我上去把视频播放控制器造出来再说。

播放的视频就先拿本地视频来播放,很多地方需要跳转到我的控制器,我想让别人先实例化一个ViewModel然后把所有的数据存进ViewModel的属性里,初始化我的控制器必须通过ViewModel实例来进行初始化。

那么viewModel里面的属性包括,Url无论是本地还是远程,本质上都是Url,再然后到时候在添加,使用ViewModel真的可以随时添加呀,简直太棒了。

当我点击上传的时候,

2017.03.10

查看评论所有回复,干脆是听哪一个新的View比较好,这样直接就可以通过代码来创建一个reply的TableView,而且不会乱,不用重复刷新数据。更重要的是,不会影响tableView的index序号。

还有一小时时间,我要把全部回复的界面搭建完毕,我依然选在在控制器上XIB来实现此功能,是在太简单呀,让人无法拒绝,而且,我决定挑战自己一下,考虑让评论tableview和所有回复共用一个TableView,那么刷新的时候会没用动画,而且更重要的是,我就无法记录评论的滚动位置,依然两个View实现覆盖会更好一点。

cell里面嵌入Tableview,现在cell已经搭建完毕,总共有三套tableView但是公用一套委托回调,因此逻辑梳理尤其重要,现在然第二套tableView来开始刷数据,前提不能影响第一个TableView的数据刷新。

仔细对比,其实发现评论cell和恢回复cell是一个值,这样我直接使用评论cell,通过判断回复数据的数组是否有值来决定是否显示tableview,从而还要定一个cell就可以了,然后在cell里面继续展示一个类似于聊天框的tableView,我必须好好重视这个Cell的定制,然后在直播的聊天地方也可以用。

接下来需要做的就是一个动画了,让所有的tableView展示起来。首先我要实现功能,到底如何最省力。1、评论Cell和回复Cell公用,然后通过回复的数组有没有值来判断是否显示tableView,但是问题是居然显示了tableView这就不科学了。

两个tableView公用一个cell最大的问题就是区分当前的tableView的tag值,然后执行不同的逻辑。

还是觉得太乱了,现在出现cell扎堆出现,这就不科学了呀,是什么原因引起的呢,造成了如此大的伤害,我需要认真想一想,先看评论,然后看回复。

使用RAC将cell里面的按钮事件传递出来遇到一个最大的问题,就是传递信号应该是把序列号也传递出去吧,如此才能知道最准确的点击cell位置,不对,没说到点子上,我在创建cell的时候将cell的点击事件传递给

为了缩减我的思考量,我决定还是把评论tableview和回复tableView的回调委托事件分隔开.

现在已近将两个tableView的委托回调分开,但是点击cell上按钮进入具体数据的命令还是没有得到解决,当我点击cell的按钮,知道模型用来告诉我点击的准确的cell的信息,知道按钮类型是为了让我能够知道下一步到底是对这些信息如何处理。

当我创建cell的时候,我将每一个cell上的按钮转变成信号,这个信号包装的值必须包括indexpath,因此必须写在刷新cell的方法里,至于问题的关键是,我给每一个cell的按钮都注册了通知,当cell被点击时,就会把我最初写的信号值传递出去,但是,本质上,一个cell就是一个view,一个view就需要将View的subject热信号与viewModel的signal建立绑定的关系,这没有错,粗偶就错在,如果我复用了呢,问题可能就出在我建立连接的时候,如果我多次建立连接,会出现一个问题, 干脆先想一下如果不用RAC怎么处理cell上的按钮事件,然后把这个按钮事件传递出去,建立连接我不想复用的时候去写这个,把RACObersever放到cell配置方法里和放到cell的初始化方法里,有什么区别,复用cell,只要cell被复用之前,我需要处理将按钮事件的信号移除,可是如何移除rac信号呢,我需要

找到问题的关键了,必须使用takeUntil:cell.rac_prepareForReuseSignal,在cellForRowAtIndexPath 里面,会被重复调用,如果不加上面那句话,一个button就会有多个监听者,button的事件代码就会重复调用。那么每次Cell被重用时,该button都会被addTarget:selector。takeUntil操作是监听某个事件直到什么时候结束。即监听给cell的btn添加响应事件直到这个cell即将重用时rac_prepareForReuseSignal到来会触发disposable信号结束监听。非重用类型的控件的生命周期可以用rac_willDeallocSignal 信号监听,但是在开发中很少会用到此信号,因为大多是信号操作的内部代码里都帮你做了这个操作,即监听一个事件直到自己结束时停止监听

当我点击view的时候,我希望弹出View,但是这个View,想了半天还是觉得写成代码好,毕竟xib根本没有做什么特别麻烦的工作,反而还不能随加随减。

layer.cornerRadius
layer.masksToBounds

2017.03.13

微信朋友圈,控制器移植。移植高少东的微信新朋友圈,

本来我在昨晚朋友圈的移植之后就该写RAC的,但是看到那个videoCell特别漂亮,于是想模仿,突然发现,竟然与本身拖进去的库相冲突,这就不可科学了, 尤其是看到我本来想要Pod的,但是一旦自己脱了,就会发现后来的Pod与前面的拖得发生冲突。

现在有一个问题,到底我是先用MVC让朋友圈跑起来,还是直接就转变成RAC呢?我觉得还是先让效果跑起来吧,毕竟我最中想要看到的还是效果,况且,这个Pod和手动导入的关系,必须是在使用RAC之前完成。

我把微信朋友圈使用RAC来做,唯一意义就是让控制器更加简单,同时梳理逻辑,而且有这个信心利用RAC让朋友圈变得无比简单。替换所有的通知、Block、委托、KVO监听、同时也是一个梳理逻辑的好方法呀!

ViewController就干两件事情嘛,一个创建视图另一个绑定事件。本身作为TableView视图控制器,自然tableView的回调方法就回调到Controller里面。所以这里讲tableView的委托指向UIservice就不划算了,直接就在controller里面吧

那么需要绑定的事件都包括哪些事件呢?上拉加载事件、下拉刷新事件、

2017.03.14

首先初始化viewModel,将View视图的按钮绑定到ViewModel的subject事件之上。

SDAutoLayout的用法,貌似很好用的样子,现在我就一个一个目的,通过SDAutoLayout完成cell高度自适应,感觉迷迷糊糊的。

在处理朋友圈的高度自适应之前,有一个特别重要的问题就是我明白SDAutoLayout的使用,只有这样才能进行下一步,好的啦,这样我成长的时候来了。

tableView是如何计算cell的高度的呀?输入indexpath和一个屏幕宽度怎么就能够知道cell的高度呢?莫非前提给tableView输入了模型数组。

cell的所有子视图布局不要涉及到底边,在cell内部设计好所有的子视图布局之后,cell调用方法也就是说告诉cell你距离cell最下面的哪一个子视图的底边的多少边距就可以了。

然后在tableView的回调方法里,把cell的model和indexpath和cell类和cell宽度一起传进self.tableView的方法里就可以了。甚至更简单的就是直接传入cell的indexpath和cell的最大宽度就可以了。

原理清楚了,就是在计算高度之前,让所有的cell的子视图附上值,然后子视图全部布局完成,最后获取cell的最后布局并将布局完成的cell高度返回回去。

现在说我layoutsSubview方法除了问题。问题在哪里,我怎么不知道,问题是我看了没发现什么问题呀。

检查你的“layoutSubvies”方法.原来是我把图片名称当成图片给赋值了,但是为什么不提醒我呢。

现在什么都好了,就还差最后一步,就是我要把评论回复搞定,这个尤其重要,直接关系到我所有回复能否实现,现在就是搞定吧,问题的关键是Lable的没有改变位置约束,三条评论摆在了一行上,这就不科学了。

接收到所有评论模型数组之后,逐一赋值到Lable上,同时将Lable存入数组,然后遍历这个包含所有Lable的数组,注意设置每一个Lable的位置。

现在遇到一个问题,如果没有评论,却依然出现空隙,然后我判断commentArray居然不管用,这就不科学了。

如果判断没有评论数组,我就以ContentLable为最底视图算Cell,这没有错,但是为什么还是会有commentView的空隙呢,要知道这是后commentView的高度是0呀。就算高度不是0还有左右上,我就用了sd_clearSetting。但是更严重的问题出现了,就是评论栏直接跳出cell外了。这个时候不是没有评论么?

终于搞明白了,高度确实是计算的正确的高度,但是内容却用的是原来的内容,自然就问题大了,唯一的解决之道就是cell 复用前删除原来的内容。

2017.03.15

第一个问题是解决全文和收起的问题,我必须搞定这一点,对这就是目标,然后这个异步完成之后就会子评论如法炮制也弄一个超过3条子评论就折叠的效果,这是一个好技术。

点击更多按钮逻辑:1、点击全文 2、block回调indexpath到cellForRow的方法里 3、通过indexpath找到cell对应的model 4、修改model的isOpening状态属性 5、reloadRowAtIndexpath

cell怎么会知道indexpath呢?创建cell的时候将indexpath传入到cell的属性里面去了。

在这之前,首先要处理的问题复用造成的显示障碍,明明是该显示morebtn的,但是没显示,发现问题,明明三行显示不下,却判断为全部显示,但是有没有全部显示,这是为什么呢?因为B复用A的时候,依然使用的是A的最大高度,这就是造成无法再给Lable重新设定高度。

设置了button的heightIs为0的时候为什么button的文字依然显示呢?只不过不会进入SDLayout计算高度之中罢了。成功解决问题。确实文字小于180字,也确实该全部显示,计算的高度也确实是所有文字的高度,moreBtn也确实没有显示,就是Cell复用后Lable的最大允许高度仍然在发挥作用,因为最大允许高度覆盖了自动调整高度。

快点,加快速度,分析原因何在,本质都是评论View的底部,当我reload的时候, 就改变ContentLable高度,然后重新计算cell高度,计算过多,原因评论view尺寸不对。

判断数组的元素为0只能通过dataArray.count来判断。

2017.03.16

当前授权状态、未选择、不同意、已同意

请求授权、同意、不同意则提示跳转设置开启授权、

未授权、停止视频音频捕捉、pop控制器、

判断摄像头权限、

2017.04.01

首先是搞定渲染的问题,面临选择,第一工程中改,第二从历史出发,先把demo跑起来,我觉得还是先把demo跑起来,需要前提,旧的SDK这没问题,登录账号,这没问题,SDK注册信息,这没问题,然后观看是否渲染成功,渲染成功后,必然是自己的原因,查找渲染失败错误原因,解决历史遗留问题,关键是渲染视频不回调,这个问题出在哪里,只有Demo能够告诉我,所以得好好想想了。

第一步,运行Demo包括:旧SDK、腾讯云账户、用户名和密码、获取签名不知道是否需要。但是在开启渲染之后查看View的所有subView绝对是一个不错的选择。

ILiveSDK、TILLiveSDK、IMSDK、AVSDK下载

美颜滤镜SDK下载

四度空间

AVSDK文件夹目录:

IMSDK文件夹目录:

Frameworks文件夹目录

开始运行。这次的版本都是最新版的,以后都用最新版,这才是关键,然后顺带解决渲染问题,接下来我就抽离私聊,抽离私聊还是修改直播,这是一个选择, 私聊是直播的很重要的一个环节,但是直播作为基础,我有感觉更加重要,毕竟私聊是一个分支,而直播才是老大,可是私聊又是直播一个很重要的逻辑,需要重视起来并认真捋一捋,否则直播逻辑很臃肿,抽离掉私聊的直播会变得十分简洁,既然最终的目的是想要一个简洁的直播,那为什么不直接造一个简洁的直播出来呢,真的是,其实直播模块跟我写的其它模块并没有什么本质的区别,除了条件静态库之外,我实在不知道还需要做什么。

SDK下载完毕,开始我的随心播之旅。已经在真机运行,不知道会产生什么样的提示,或者说我应该看到一个什么样的随心播,这应该是一个公用的随心播放吧,然后从这里面找到自己的出路,这也是我未来封装SDK的模仿对象。

首先就是登录界面,用户名+密码,必须是登录方可使用,也可以注册新用户,这个用户自然注册到腾讯的直播平台服务器上去了,然后就是发视频和看视频了。

注册了腾讯测试平台的账号+通过此账号登录+修改封面+设置标题+请求房间ID = 开启房间成功+业务层出现房间列表+同样注册此平台的用户看到房间+通过房间ID观看直播+我需要重写这个随心播放么,感觉自己写的总是鲁棒性不好,总有考虑不到的地方,所以需要注意了,必须找到一个老师来学习,这个老师就是Demo,我自己想了这么就竟然还不入直接跟着老师走,可能老师真的很重要吧,现在我是继续测试这个随心播,然后研究一下ILiveSDK。

开启房间,播放视频和结束播放都没有问题,当我点击PAR的时候,我不知道PAR是个什么东西,但是立马造成了程序的崩溃,而且不知道是网络原因还是什么原因,这个直播感觉有点卡呀,因为PAR点击崩溃,就另外感受一下ILIVE的魅力吧。

ILIVESDK顺利跑起来了,我需要先设置一下我的账户类型,并同时注册两个托管账号,这样就可以获得签名进而登录到ILIVESDK。

现在已经修改APPID和托管模式,就等接下来的账号登录结束查看是否成功,这很重要。只要能偶登录成功,改完APPID和ACCount果然登录成功,看来错一步都不行,走钢丝,没有点智商根本干不了呀!

当我登录成功 = 当前用户昵称 + 注销按钮 + 输入房间号 +输入主播昵称 + 选择创建直播还是进入直播 = 渲染层View开始渲染 + 创建房间成功Lable提示 + 输入被邀请者id输入框 + 邀请上麦按钮 + 取消邀请按钮 +取消上麦按钮 + 退出直播按钮 + 输入消息内容输入框 + 输入消息 + TextView显示IM消息

输入同一个房间号 + 进入房间按钮 = 进入房间成功Lable提示 + 主播段提示XXX进入房间 + 麦克风开始连通 + 观众端摄像头并没有打开 + 观众正常发送消息

如果888房间号正在使用 + 继续创建888号房间 = 提示group Id has be used!

现在随心播的Demo都已经成功跑起来了,至少验证,我的程序不渲染绝对不是SDK的问题,更加说明,Demo的运行并不费事嘛!就是一个拖文件夹+修改用户名和密码的步骤,简直了,大脑总是把一些很简单的事情想得很复杂,大脑你是不是傻。老骗我,现在我要把ILIVEDemo自己写一遍,那么我需要做的就是一个简单的复制加粘贴加写注释,这简直毫不费力。说干就干。

第一步建立工程,搭建UI界面,就照最简单的来,先登录+登录完了创建直播+创建成功跳转控制器+仅此而已。

问题关键不在于此,在于用户登录,这里使用托管模式,所以几乎全用腾讯接口,但是本质独立模式,非注册台的用户名和密码来登录,更多是通过九合ID和TLS票据登录,这就科学了,九合ID需要登录,登录就需要网络请求,既然如此,把所有的登录都交给上次的RAC登录注册来搞定,十分容易。

然后主控制器就是用户登录后的结果,用户名,房间号,主播昵称,创建直播,进入直播,注销,完全就搭配起来了,好腻害。

既然功能最重要,那么我先按照原工程一模一样的UI来打一个独立模式的直播,就这么轻松的搞定了,先把独立模式的直播跑出来,简直太容易。然后在逐个替换掉旧的控制器,构建自己的UI,就这么办,首先导入Pods。导入登录注册的基础。

当我还没有导入AVLib的时候,事件处理里面的直播逻辑问题很严重,我需要一个宏定义先屏蔽一下,宏定义也为下一步的Pods铺路。

现在Pods已经安装完毕,下一步就可以将登陆注册页面引入,添加宏文件,然后简单的登录成功逻辑。最重要的宏文件就是要需要把请求头写成宏文件,这个太重要了,UserID、TOken、当初能够全局共享的资料都应该写成宏文件。

微信登录,我需要真机才能进行,以后所以必须通过真机搞定,貌似登录的时候不需要user_id和user_token,所以此时并不需要,我只需记录手机登录成功过后的信息就可以了。

重新布局了登录注册的提示,我觉得还要优化的空间在于登录成果过后,应该返回是一个字典,然后每次安装猿题库APP之后都会去agent类条件打印,着实很让人烦。我也需要更新一下我的RACDemo,我想要的是直接我拖过来就能用,但是每次都不是,捣鼓半天,这说关注点分离的不是很好,另外,我绝对猿题库如果不用Pods会不会好一点,毕竟我每次Pods都需要弄一个打印真的好烦。

既然登录引擎请求了数据,如果我在能偶将数据的存储写在这个单例类,这就变得尤其简单,我只需一个字典就可搞定一一切。

遇到一个奇怪的问题,明明id类型值为0的数据竟然通过了if真的判断,简直了,还是通过字典来锅炉处理完成的信号把,通过id类型的数据来过滤if判断太伤人了。另外,为什么网络请求会失败呢,这不科学呀,因为我没有初始化猿题库的基础BaseUrl,YTK必须在开始初始化的时候写入。

现在登录的API已经更改,我必须重新设置登录请求头的BaseUrl。现在我调登录的接口,说起缺少请求头,我就纳闷了,怎么就跟请求头去烧了呢,作为一个类别方法,根本不需要是使用头文件应用呀。全局搜索一下。

现在的问题是为什么runloop写的方法无法争取被调用,明明就是在调用方法时候调用此方法嘛,但是为什么就失效了呢,不调用。全局一搜,不是不调,而是我写了两个runloop方法,刚好打断点的这个方法没有被调用。

现在查看一下秀波里面的请求头长什么样子,搬过来不就行了,实在不行就用秀波在手机跑一次,打印所有的数据。妈个蛋,咋就死活调不通接口呢,简直了,就无语了,这必须得想一个新的问题呀,简直了,根本不知道为什么会这样呀。当我一说要装秀波开始不怕麻烦死磕到底的时候,尼玛,问题居然又迎刃而解了,简直了,难道这是考验我?

将一个键值对存进沙盒里特别简单就是实例一个对象,然后调用set方法就可以了,为什么我脑袋老是欺骗我说这个很复杂,我想说,复杂你妹呀,根本就是一句话的事,大脑你为什么老骗我呢。

现在我就可以开始导入SDK了,毕竟逻辑都以十分清楚,就是一个简答的请求房间ID的问题,到底现在这个房间ID是自己来搞定还是必须通过服务器分发,当然这个是在不行,我写成宏定义,然后手机登录秀波,然后获取房间ID号,这不是什么问题。

程序段部分编译,适用于那些如果有了什么定义就只执行程序段一或只执行程序段二的程序,效果岗岗的。哈哈,原来是int和NSString没有区分好造成失误。

独立模式和托管模式随意切换, 我真是厉害呀。感觉直播好简单,就是一个一个控制器,self.view就两个View,一个是渲染View,一个是交互View,交互View的事件都也已经写好了,渲染View也搞成功了,简直棒到没朋友呀。我现在就去掉所有的按钮事件逻辑,就添加两个View,一个渲染一个交互,仅此而已!

把Demo里面的代码重新一些,觉得简直就是简单极了,视频直播怎么可以这么简单。

2017.04.05

首先要做的事情是经一部抽离我的直播模块,然后重构模块,现在最重要的是,现在究竟是先解决秀波历史遗留问题,还是搁置一边继续我的直播抽离,其实二者并不矛盾,就算继续我的直播抽离,也十分需要先梳理一下秀波的逻辑,然后才能更加方便的做事情。

淡然第一步,就是继续消化上周遗留的Demo,把所有的逻辑完全嵌入自己的大脑里。梳理的唯一方式不就是写注释么,写注释的意义在于缕清程序的逻辑链条,我要实现的最终目的是开启我秀波的渲染,对啊,既然如此,先去梳理秀波的逻辑,然后带着问题来梳理Demo的逻辑,不亦乐乎!

在抽离直播之前,还有一个更重要的问题就是视频裁剪,这个重要了,否则放的视频根本就没法看,好不好,所有将视频裁剪成我想要的比例变得尤其重要,当然首要任务还是把直播的渲染搞清楚,这可是我花费了大量心血的地方。

解决秀波历史遗留问题的步骤是什么呢?首要任务就是分离关注点,到底开启一个直播最简单的步骤是什么?我严格按照Demo来做。登录IM—>创建房间并开启渲染。秀波一直觉得乱的根本原因是没能准确控制静态库。

现在的我大有一种想要彻底重构发布直播控制器的冲动,可是我准备好了么?这将是一个无比耗大的工程,涉及到界面,涉及到网络请求,涉及到事件处理的交互,涉及到内容输入,涉及到RAC,我只能一个模块一个模块的来,那么首先来的模块应该就是网络请求了,这是一切直播开始的基础,包括请求房间号和定时器更新,总之一切都是需要模块化,我理想的情况就是我在Demo里面重建了一个秀波直播控制器,完全脱离秀波应用而独立存在,View层我已经准备好了,网络层我可以就很快搞定,ViewModel逻辑处理层也可以复制粘贴很快搞定,剩下的控制器将变得尤其简单。所以了,关键之除了网络层和ViewModel逻辑处理层,这个太重要了。越发觉得重构我的直播控制器也不是什么特别难的事情,因此可以做一番尝试,但是在尝试之前,现在马上需要考虑的问题就我要够随时发起直播,所以我的界面很简单,就是先把直播能够随时打开和随时关闭,这是我的ViewModel的最重要的两个逻辑,然后就是除了聊天之外的基础逻辑,而且我有自信随着不断深入,那个不渲染的问题也会迎刃而解。

所以着手处理逻辑当然事情,把相比之前,网络层毕竟是为ViewModel服务的,因此可以先写ViewModel遇到需要网络数据的地方,咋可以先給一个固定的死数据,然后皆可以搞定这一切了。

现在已经走出了历史性的一步,构建了发布直播控制器,然后就是初始化ViewModel了。现在我需要知道跳转进直播控制器的第一件事情是什么,当然是创建房间开启渲染呀!至于是直播正式开始前的View还是正式开启直播的View,视情况而定。反正就是要搞定这一切。固定数据都先写成宏定义,这样就好很多呢,直接就可以更改了。

现在已经搞定了观众上麦的事件回调,只要观众上麦,就会获得想要的屏幕区域,然后开启渲染,Host_I�D是一个宏,我需要一个固定的九合ID来进行接下来的测试。创建房间是这个Host_I�D,回调的视频ID也是这个Host_I�D,自然我就能偶渲染出主播自己的画面了。我的房间ID也是一个宏定义Live_RoomId默认888.有了主播ID和房间ID,自然就可以开启我们的你房间了吧。

其实我也只需要也只能固定房间ID,主播ID是严格与登录IM的userID绑定了,所以必须是是实时登录过后的值,因此不能使用宏定义,必须是我的登录IM的九合ID账号。现在是模式的最简单版直播逻辑,我要来跑一下。

现在遇到的问题是如何来管理这个ViewModel的声明周期,为什么我的控制器都销毁了,但是控制器的ViewModel属性竟然没有被销毁,不被销毁的情形包括强委托、循环引用以及定时器未被销毁,这里的问题可能很大程度上是因为循环引用吧,到底如何避免这个问题呢,但是大致一想,好像并没有出现循环引用的问题,那么还有什么原因会造成ViewModel无法释放呢,这个问题真的很重要,直接决定了我还是用通知的有效性,必须加以搞定,这是摆在我面前最最重要的问题。否则都只能把通知的生命周期寄托于控制器了,但是我不明白,控制器的ViewModel强引用属性都还没有被销毁,控制器怎么就被销毁了呢?着实让人难以理解,回血ViewModel的销毁根本不走这个控制器销毁路线,那我干脆写成TIp来一个更直接的展示吧!

现在我就纳闷了,我是继续写呢,还是停下脚步先解决这一个问题,就是我想要弄明白,到底是什么原因造成了我这个ViewModel无法释放,会不会因为帮助类的工厂方法造成无法释放,说什么定时器,强委托,循环引用,我这里都没有啊,那问题出在哪里了呢?看来这是一个很神奇的问题,我需要看一下视频。

看一下RAC循环引用的问题,循环引用直接造成了我的内粗你无法释放呀。a的属性等于b,b的属性等于a;block属性属于a,相当于a持有了block,然后block又持有了a当然造成了循环引用。我就想不适用RACComand来查看是否还会有循环引用,这个太关键了,到底是什么原因造成了循环引用。

那么当我没有添加View的时候,原来并不是不释放,而是我搞错了,释放了自己没有看见,明明释放了也不会打印,我却在打印区域里面寻找释放的证据。既然生命周期搞定了,我就可以开始下一步走了,直接就是添加View了,然后实现两个View之间的切换,就像私聊的两个View之间切换,我弄一个开始直播的View这样直接太开心了。所以我需要的原材料包括,两个View,一个是魏开启业务直播前的View,一个是已经开启业务层房间的View。

现在我已经把原本用来开启直播的View成为我的一个默认视图了,所以现在的我就直接拿到这个View的发起直播按钮,然后跳转到正式直播的人View上,想起来,还正式快呀,一旦把这个搞定,直接就可以处理事件的响应了。然后我就能够进行下一步的选择了。

现在直播开启前的View已经创建完毕,接下来就是正式直播的主播View了,这是我过去心血之作,现在把他拿出来,简直不要太开心,哈哈。

这里有一个问题,就是我原本的发布直播View的所有交互事件都是通过view持有raccommand来实现事件的传递,甚至对于一些网络请求的交互使用到了viewModel的RACComand属性,那么现在我要重新考虑使用RACsubject来作为View事件的传递是否可行。目前看来没毛病呀,相同过Subject把View的所有事件传递到Controller,然后在ViewModel里面持有的VC继而持有View继而持有View的Sunject。

在这之前,有一个很关键的问题,那就是到底这个baseView的viewModel传递事件和LiveView的ViewModel传递事件的联系是什么呢?联系就是父类子类共用一个信号传递器,把通过这个信号传递器子类父类都可以使用,把自己的事件传递到ViewModel里面想要想要传递的地方,只是我发现,如果View有基类,那么viewModel也应该有一个基类,因为,主播View和观众View都需要添加键盘输入框到控制器上,而且如果有BaseViewModel,甚至还应该有BaseViewController,这个太重要了。毕竟ViewModel是把输入view添加到控制器上呀,算了吧,我就先写两次,然后在优化,反正都是一样的,我拷贝就是,只要知道这个地方有优化的可能就可以了,升值来说,只要接的ViewModel也可以想View一样弄一个继承的关系就是什么都搞定了。

但是首先就想把观众和主播ViewModel完全独立吧,反正后期有大把的时间可以优化。万一我想到更好的办法了呢?

2017.04.06

今天继续我直播抽离昨天,原本过于看重继承了力量,其实如果把稍微复杂一点的View都抽离出来,是否使用到继承就关系不大了,这就是模块化然后组装的力量。所以继续模块化吧,感觉特别开心呀,更重要的是,如果我要做任何人更改都必须在LIVE这个Demo里面进行更改,否则就会发生冲突,这点尤其重要,必须先修改,后拷贝,甚至把要拷贝的东西都统一记录下来,统一更改。好吧,开始干活!

现在我所有使用到Subject的地方其实都是在使用字典来传递数据,这就是我的想法,既然字典是如此好构建,扩展性还这么强,删减容易,是在让人很难拒绝这个字典带来的方便性,简直方便入字符串,不亦乐乎。

Xcode怎么老是崩溃呀,好奇怪!现在遇到一个问题,我要直接把BaseView的按钮事件通过Subject传递到ViewModel里面去,可是如何才能传进去呢,唯一的办法就是通过Controller这个中介。

现在这个私聊页面除了问题,问题在哪里呀,我在呢么不知道,感觉好奇怪,难道不应该跟简单添加一个View一样么,怎么出问题了呢?检查了适配代码并没有发现什么猫腻,但是看到的结果就是感觉添加的位置严重不对。查找View分层感觉是错误使用了变量。果然如此,本来是设置私聊页面的transform,我给设置成了self的transform。简直了~

现在我还需要搞定一个事情就是当我点击群聊的时候,我要能够将?chatView同步上移,这个很简单的,一句代码搞定,同时哟,让发送的消息显示在最后一行,这个也不是什么大问题吧,于是下午就来到了人生中最关键的环节,就是创建聊天View,这个太重要了。我严格按照MlLable来实现,一个Lable让表情和按钮通通可以实现,这个做完了,还有私聊的页面,任务艰巨呢,所以必须得加把劲儿了,本来我还想现在就把这个View平移过去,我想了一下还是先算了吧,直接把直播的所有逻辑都写完了,写到我认为没有什么Bug的时候在传递过去,这样就可以搞定这件,这将是千年大计。

对了,千万不可忽视内存引发的血案,直接就是我使用RAC的重中之重,尤其是通知。所以显性提示。

现在首先搞定输入框上弹,ChatView同样平移问题,然后增添美颜的View,任务很重呀!这还只是直播页面。糟了,现在遇到一个超级大的问题,发现inputView的内存没有被释放,这就坑爹了,我得想一想,什么原因呀,分析一下,inputView不就是创建了输入框和按钮么?首先是BaseView强力持有inputView,那么inputView无法释放的唯一解释就是inputview也强力持有了baseView,可能么,好像属性都没有,这并不现实,但是inputView持有了subject,subject可能间接持有了baseView。

为什么老是释放不了内存呢,这个问题好严重呀,简直了,根本没有涉及到循环引用呀。而且也确实是先置空inputView然后置空shadowView,简直了。我估计是因为继承有子类的原因,即时我把View改成了weak弱引用,依然无法释放内存,那么接下来就是通过美白View来验证一下是否是这个确实是因为子类有继承的原因,还有,实在靠View的生命周期不行,我完全可以通过方法被调用的信号来管理通知的声明活动范围。

算了吧,在怎么搞得,我竟然无论怎么样都无法搞定这个内存泄露,但是通知肯定是没有什么问题了,通过在阴影点击事件之后将这个通知给注销掉,另外我把RACSubject改成weak弱指针不管用,把父类的全局属性改成私有属性不管用,把View在置空前先置空RACSubject也不管用,这让我更加怀疑我一直释放不掉View的唯一原因就是RACSubject强势持有了View,而View又强势持有Subject,造成View时钟释放不了。这个问题先放一放。

哈哈,果然如此,困扰我一中午的事情终于被解决了,原来是因为Subject的问题,竟然是因为Subject造化循环引用,那么我需要做的就是防止使用RACSubject造成循环引用。

现在终于知道了,哎使用Subject响应按钮事件的Block的时候通过self.Sunject发送信号的时候,必须将self改成weakSelf。否则内存泄露,造成无法管理通知生命周期。因为self持有Button,Button的响应事件又持有了Self.直接造成循环引用,更重要的是,我把Sunject改成weak指针竟然没有什么好处也没有什么坏处,按理说,如果weak版本的Subject,也并不能改变Button持有self这个事实,而且就算你把Subject改成了weak,也只是self不能管控Subject,但是只要subject一朝不发送complete信号,Sunject就一朝持有订阅者,订阅者也持有Sunject这个死循环就破不了。

现在终于把这个内存泄露的问题解决了, 下一步就是一个美颜的View,说实话,这个好坑呀,居然不是按钮,而是UISlider,如此一来,我就需要先处理如何来传递我的信号呢,我不不仅需要向外面传递信号,更需要把外面的初始值设定到View的Slider控件上,所以也就没有比要再设定什么Sunject了,直接把View的Slider暴露在.h文件里面。

本来我原本是打算只写PublishView,但是转眼一想,干脆把PlayerView也写了,这样就可以获得详细对待这个子视图和父视图的关系了,现在好累,听着音乐,发现有一个细节,就是子类继承父类的出现的按钮事件重复添加的问题我原本是如何解决的。感觉根本没有必要把所有按钮事件单独提出来呀,其实提出来我也不是特别反对,就是我想把暴露在.h的属性尽可能搬到.m文件里面去,折痕重要。

虽说都搬到.m文件里,但是凡是用到weakSelf的属性都保留属性,其余的全部改成成员变量。我觉得成员变量的用处没有属性作用大,应该更节省资源吧!

现在我在全力修改GiftView的界面,那么这个时候真是屋里吐槽,我还说写私聊,写逻辑层,搞了半天,连UI层都没搞明白呀,所以我得加油了,UI层有一个天大的难题呢,就是那个ChatView,这个的适配还有输入框交互还有表情键盘,简直了,我好忙呀!哈哈,加油。

现在我要把那个倒计时动画按钮给单独提出来,这个很重要,因为直接决定了我接下来的关注点分离是否能够执行到位。

2017.04.07

今天上午我的时间还很紧张呢,急需创建一个群聊View,这是一个无比重要的问题,十分值得期待,当然了,接下来最重要的还是说应该改定礼物View,这个太重要了,直接决定我该怎么做,比如那些属性是不必要的属性,这个太重要了。

在我九牛二虎之力4,终于把礼物界面整的仅仅有条,就对了,内存的问题呢?首先我点击礼物界面尽然没数据,这是有问题的,必须注意。应该是刷新除了问题。什么问题呢?而且礼物界面消失的时候,也没有看到内存释放的提示,这说明有问题。

原来是完了把CollectionView添加到毛玻璃上。同时全局搜索self,消除一切可能有循环引用的地方。我靠,做一个礼物View就花了我一上午的时间,果然时间过得快呀。发信啊部分的View显示不完整,竟然是因为自己origin没有设置好!

现在我遇到一个特别奇怪的问题,就是我很系那个知道,为什么手势在子视图上也可以被点击呢,那么我把View的加护允许,设置成NO是否就可以就可以完美解决这个问题了呢?

查找资料发现的解决之道是获取手势点击的View,然后判断此View的类别,如果发现此View的类别是非阴影层,就将手势给过滤掉。那么问题来了,就算我是一个自定义View,判断出来的点击View的类别依然是UIView,而父视图ShadowView的Class也是UIView,这直接造成我无法判断,问题很严重,那么子视图和父视图到底还有什么更本质的区别呢,这个太重要了。可能就是父视图了,对了,尺寸,尺寸很好判断。一般的子视图的尺寸是不可能为阴影层这么大的,但是虽然这个方法可行,我还是希望能够通过View来掌控这个手势是否可行。父视图和子视图除了差在尺寸上,还可能差在哪里呢?是够可以判断点击的视图是否是shadow的子类来判断,这就完美了。换句话说,就是shadowView的子视图数组是否包括被点击View。

问题来了,原来不论是点击ShadowView还是点击GiftView,本质上都是现实点击ShadowView,这就问题很大了呀,根本就获取不到被点击的视图呀,看来这个东西不能这个吗,那么我就把GiftView添加到Self上,反正Shadow和self的大小一致。没想到最后的结果是这么简单,哈哈哈哈!

所有的弹出式View都搞定了,就剩下群聊和动画了,这就是我最最看重的地方,直接决定了我接下来需要做些什么,好在有了修改礼物界面View的基础,修改ChatView变得经验丰富。

什么都弄好了,现在开始我的黄金任务,就是写MLLable版本的群聊界面,这是我最最害怕的部分,如果我把这个搞定了, 剩下的所有问题都将不再是问题,所以啦,加油。第一步就是按照现在的逻辑,把这个View建立在我的BaseView里面。

为了更加方便,首先就是把ChatView的两个大模块区分起来,原本我还把单机礼物的提示放到ChatView,其实根本没有这个必要,我只需要把这个提示放到谁谁来了哪里,岂不是更好,这个View就简简单单是一个TableView,我甚至都怀疑,有没有必要直接把这个ChatView写成TableView,这样刷新起来多么方便。

为了最简单实现功能,我现在就不写什么消息缓存了,就简单的把这个View写出来就可以了,甚至谁点了赞我都不显示了。因为是View,后期扩展起来很容易,现在关键是是实现功能。

写群聊肯定是需要一个模型的,如果单单只是传递属性值,可能字典就可以做到,但是思考到可能还需要这个模型来解析消息字典,所以还是写成模型比较好。考虑到私聊和群聊公用一个字典,所以模型的名字就不在区分私聊和群聊了。

突然发现,我这样做还是不能显示对方的表情呀。毕竟就算我使用MLLinkLable也只是解决了点击用户昵称回复的功能,并没有处理表情,我一直想要更换表情包,只有遮掩个,我才能获得更多的成长。

现在我需要构建一个消息字典,本来想自己随便构造几个,但是想了一下,还不如我开直播间,让别人进入我的直播间,然后对我说话呢,这样才是王道呀。我打印字典,然后作为测试数据来测。

发现消息接收到后直接就转变成Model了,必须先所以打印的也即是单个的字典,我把这些字典打印出来,然后弄成一个本地文件,这样就可以实现消息本地读取了。因为是单个的字典所有我需要把所有的字典拷贝到一个数组里面,这个太重要了,早知道我就该打印数组了,不打印什么字典。

现在遇到一个问题,就是当我设置Lable左边距5右边距0,边距0的时候,发现我无法知道Cell的宽度为0,一定时默认为屏幕宽度,如果才能纠正Cell的宽度呢?过去我在消息回复的时候也遇到过这个问题,所以,这很重要,直接关系到我的Cell上的Lable高度。

默认的cell大小为320*44,那么直接造成我没有一个宽度的设置。现在的问题很奇怪,我无法正确设置Cell的高度,这就有问题了,直接造成我无法预估Cell的高度,问题的关键就是到底如何设置Cell上的Lable,这个太重要了。为什么设置Cell的宽度没有用。

现在我换了一种初始化Cell的方法。当初是因为如果字符串没有这个字符,擅自去取整个字符串中这个字符的range,会造成验证的bug,因此我加了一个判断,如果这个字符串为空,就不添加,因为开始我没有对消息进行过滤,所以造成只要我的新消息一来,就会出现缺少昵称或内容的情形,造成提取范围找不到,其实是红包消息根本就不需要content这个属性值。

现在感觉内容也刷了,就是没有看到尾想要看到的View,你说没数据也就算了,连空的cell都没有看到。原来是因为ChatbackView是用Masonry写的,而子视图用BackView的宽度做基准,自然就是0了。这也就解释了为什么后来的设置cell宽度也没有什么用。cell的宽度反正是以tableView的宽度为基准,tableView🈶以父视图为基准,父视图🈶以基准视图为基准,而基础视图是用适配写的,根本就没有frame,所以以后的width全为0.

现在终于搞定了一切,发现自己真是厉害呀,简直了,还有一点小教训,就是如果父视图是适配,子视图使用frame需要尤其注意,不然真的要酿成大错呀。

2017.04.10

在所有开始之前,先把老秀波的直播开启吧,修改完Bug,然后就能进入下一步,然后把小视频的Bug修复掉,先条难的做吧,说私信不显示内容,很简单,把这个给解决了,验证直播间处理私信的逻辑,这也正好是我现在所需要弄清楚的地方。

小视频上传按钮点击无反应,首先就是搞定私聊界面的显示,弄懂私聊的界面显示,然后就能处理直播的发布和直播的结束了。

对于点击按钮过小的,我是想要直接在外卖那些一个大的按钮事件,然后在这个大返回按钮的点击事件里调用委托方法,将点击大按钮返回的事件处理逻辑传递到小按钮返回事件的处理逻辑里面去,可是问题的关键是,小按钮的返回点击事件是否就是直接就通过委托事件处理逻辑,还是说先进行了一部分逻辑之后再调用委托方法处理逻辑,这个很重要。或许说还有一个更简单的办法,直接改别人的源文件,首先把图片变大,如果图片不能变大,在把按钮变大,总之就是要把按钮变大。首先假设图片可以吧按钮诚达,但是不显示,毕竟如果仅仅是图片小,点击非图片区域也会响应事件,既然没有,那一定还按钮太小。把这个按钮改大点就可以了,如何找到这个按钮呢?原来果然是图片多大,按钮多大,那简单,直接就该图片就行了。

现在我上传想要人性化一点,就是我想知道这个上传结束之后,能够直接返回到视频的录制控制器,这个时候写一个通知还是一个Block比较好呢,还是说点击上传,然后上传成功后如何通知控制器一下,告诉控制器,这个上传时成功还是失败,这很重要,我老感觉别人上传成功之后依然会点击上传,这就不对了,我想要的是上传成功后跳转到视频的播放页面。

原本是因为我在ViewModel里面跳转控制器,从录制跳到上传,然后点击上传时也把这个信号传递到ViewModel,于是ViewModel处理完逻辑之后,我不知道这个上传状态,于是我想要把ViewModel里面上传视频的逻辑搬到上传控制器里,当然这时候需要传一个RecordEngine引擎过去,试事实上。我也完全可以不通过一直代码,只会简单的一个ViewModel就能把上传视频状态的信号传递到上传控制器之中,于是我思考,哪一种方式把上传视频的结果传递到上传控制器之中,这个太重要了。

到底以何种方式把上传结果的信号传递到控制器,然后提示用户,进行选择,要么继续拍,要么去看。失败了就提示点击重试!

在这个上传视频的工具类里,或许说,我在工具类写一个Block来回调把上传结果回调就可以了,这不是神没问题,就像网络请求那样,传入字典作为参数,返回字典作为上传结果。而且幸运的是,我使用的就是这个工具类的实例对象,问不是工厂方法,这为我节省了很多精力呢!

当我一切都准备好了,准备就是直接就是通过Block回调结果的时候,突然发现,居然不让我使用Block回调。理由是Too Few说什么代码块的参数不对。原来是需要传递两个参数,我只传递了一个。

现在我的问题就是已经把视频的上传状态会带哦到了ViewModel,可是如何告诉上传控制器,然后弹出Alert让用户继续拍还是立马去视频播放器看呢?关键在于一个一个ViewModel传递信号到上传控制器的问题,如何实现这一点呢,通常都是ViewModel发送一个信号属性,或者值属性,然后上传控制器订阅这个信号属性或者值属性,简直了。这里无论采取哪一种方法都是需要把上传控制器持有viewModel属性,或者说让上传控制器使用ViewModel的RacComand属性这有效地办法,可是事实是,让上传控制器持有RACComand并不能缩减代码,反而让ViewModel变得无比臃肿,所以干脆使用RecordEngine属性传递到上传控制器中,然后执行上传视频的操作。如此一来,封面和Block都省了。

出现问题了,居然出现视频签名失效的提示,而且当我点击签名的时候,竟然再次压缩了,出现了两次上传,这是我不允许的,还有图片的状态不好,不应该是拉伸。而应该是局部充满。

该解决的始终要解决,就是要搞定这个直播不渲染的问题,如何才能最快地解决这个问题,问题的突破口和关键点是什么,关键点就是我首先要切换成最新版的SDK,这个太重要,同时把这个新的SDK传给一飞,两边才能同时跑起来。反正压缩包也打了,唯一的问题就是不渲染嘛,这很简单,就是分析为什么不渲染,还是直接就完全按新的SDK的方法来做,很明显第二种思路比较好,因为第一种思路我可能根本分析不出来,现在我能看到的Demo就是使用最新版的SDK,这样就无法搞定这个东西了。所以通通切换成新的SDK的逻辑,至少给我下了一颗定心丸,这个新的SDK是能偶渲染的,而且我有Demo可以参考。

现在我已经完全把新的SDK拖入了工程,但是不敢点击编译,问题是我的ILiveUtil用的依然是老SDK的处理逻辑呢,所以要么坦然面对,要么逃避,我选什么,根本没得选呀,只能坦然面对,必然是很多方法得重写,但是那🈶怎样呢?我进入房间和退出房间可以不使用这个IliveUtil呀,直接通过SDK的原始方法来进入和退出房间,这并不是问题呀!

这一次我就开始把创建和进入房间的逻辑写到ViewModel里,控制器开始一点点瘦身,还有自己的ILiveUtil也并没有出现我想象中的哪些冲突,这是很神奇的事情,更重要的是,竟然ILiveUtil完全一点问题也没有,看来这一次是真的可以把创建房间和退出房间写到ViewModel里面了。

现在我已经把进入房间和开启渲染的逻辑全部从控制器中抽离出来了,接下来就是一个暴露控制器的主播ID和房间ID的过程,我一直不明白,为什么原来没有吧这个直播间ID和主播ID暴露在控制器的.h文件,答案就是当时都全部使用Model来初始化控制器和创建进入直播间了。

现在我直接就是在直播控制器的ViewDidload方法里创建直播间了,可是问题的关键在于,我的创建直播和观看直播都是在这个控制器里,问题我如何判读该用户的身份,然后决定是创建房间还是进入房间,为了避免繁杂,暂且使用主播的身份来开启直播,暂忽略观众的影响。那我就破罐子破摔,干脆把直播间的用户身份也写进.h问价你的属性里,作为全局变量来用。

我终于知道为什么一直不渲染了,原来是因为登录IM用了UserID,却使用了人九合ID来作为视频的渲染ID,当然就不能渲染了。哎,好坑呀!一切的一切,尽然是因为我什么时候改了登录用户ID,这可真是把我急坏了,现在又出现一个新问题就就是怎么没有订阅到RACComand的结果信号呢,这又是一个坑呀!为什么没有信号回调呢,这可是个大问题,我就是指望你回调然后给我一个继续下一步的信号呢,你却什么都不做,这怎么行!

现在的疑问是为什么RACComand的信号传递到控制器,控制器订阅不到。后来我通过ViewModel的RACSubJect解决了这个问题,但是我依然觉得还是该用RACComand,毕竟这个才是我想要的内存管理呀,但眼下最终要的事情,还是说我把我的直播抽离的私聊界面添加上去,然后刷一些假的数据,这个很重要。

除了这个私聊,我还有弹幕,还有排名,还有表情,还要点赞,还有礼物,还有红包,通通都构建点假数据来充实一下UI.任务艰巨呀!后面还有网络层、和业务层。还有IM通讯。今天就先搞定私聊的UI,看看到底在假数据的前提下是一个何方神圣!还有头像,也弄一些假数据,这很重要!令我开心的一件事情是,我的表请写到MLLable,竟然无需转码直接呈现。

现在好累呀,关注列表还有载入缓存会话都先缓一缓,我要先把UI搭建起来,然后造点假数据,就算大功告成了。哈哈

2017.04.11

今天继续我的消息聊天界面,昨天已经把私聊会话搞定了,今天还剩下私聊的聊天界面,这里面有一个超级关关键的问题就是发送表情和和逻辑处理,当然不需要弹幕,但是这并不是什么问题呀,我只需要在初始化输入框之后,把弹幕这个按钮的适配更改一下就可以了,只是问题的关键在于,我需要在点击聊天框的时候整体transform私聊界面。按理说,这样是可行的,但是我觉得还有没有更好的办法呀,或者说,我只是在这个立私聊页面添加私聊的ChatTableView,至于输入框,我放到BaseView里面去,然后就能够解决这个问题了,问题是我该如何搞定这个问题呢?

我即将面对一个巨大的挑战,就是别人要给我发私聊,我要把这些私聊截取下来,然后存入目录里,进行慢慢分析,构建自己几个自定义的私聊信息,然后显示我的私聊界面的前置,更重要的是,我还奥研究一下发送表情呢,这个好重要,当然眼下最重要的事情,就是构造私聊消息。选择默认的是私聊界面,我根本都看不到聊天界面,我就很疑惑要,我需要的是在点击会话的时候。

私聊聊天页面居然也事件回调,就是那个输入款给的输入内容,包括发送消息和发送表情,为了在其它的控制器也能使用到私聊的输入框,我想了一下,干脆就把输入框写到私聊聊天View里面去吧,毕竟我不能一说到私聊聊天连输入框都没有呀,而且也不用过多担心表情的问题,反正我们是公用一个输入框,只要把表情添加到输入框View里面,就所有的输入框都有表情了,而且是一个特备好拆分的表情输入框。所以还是把输入框写到私聊聊天View,然后搞定了输入框,就构造一些假数据,简直了,怎么可以这么开心,我综合觉得,为了不被LeanClound还是IM绑架,综合觉得还是使用模型来刷新私聊消息变得尤其重要,更重要的是,一会儿打印私聊消息的时候,一定要把所有的私聊消息先转成字典,然后把字典装到数组里面去,再然后打印数组就可以了,这个数组就是我想要的自定义私聊消息字典数组,一键刷成模型数组,简直完美!

我弄错了,我需要上移的不仅仅是私聊聊天View,更应该是整个私聊背景View,以为着我需要把键盘通知写到私聊背景View,活着每次键盘通知变化,都把这个键盘的信号传递到私聊背景Veiw,那么还有没有更简单的办法,至少让我觉得不需要传递这么多信息。如果真的需要传递这个键盘的信息,那干脆把输入款给的所有信息写到inputView里面去岂不更好,那么问题来了,我需要做的就是分析我如果把输入框的通知写到InputView里面需要还什么前提呢,最大的前期就是严格管理InputView的内存,这样也局限了问题的位置,只要局限了问题,后来的事情也就更好解决了。

说干就干,现在我尝试着把TextFieldView的所有通知都写到inputView里面去。发现把textField的通知写到InputView里面是可行的,完全可行,简直就是太棒了。所以接下来还是搞定这一切吧!

遇到的现在初测不到发送的消息。现在我终于把输入框写入到一个。原来把输入框的通知写成一个单独的View是十分可行的,唯一需要注意的就是一定要管理好内存,如果出现内存泄露,通知的生命周期将变得无法控制。现在是这样的我发现一但我发送了complete的信号,以后所有的信号都无法再发送了。所以这个complete信号必须是快要注销View之前来发送,不能过早的发送呀。给输入View发送complete信号的必须实在注销私聊聊天View的时候,这个时候就包括点击返回会话的时候,点击退出私聊的时候。所以我必须在关闭私聊的时候把这个私聊聊天View的信号和输入框的信号给删除掉。

构造假的私聊数据,这个太令人激动了。哈哈。现在的问题是本身我没有这个消息的解析过程,这个消息体本身就是一个模型了, 我需要做的就是把这个消息进一步拆分。然后转变成我自己的模型,这个太重要了。

现在我已经搞定了这一切,就是把私聊的死数据也早好了。死数据开开心心的娴熟出来了,只是表情的地方有一点不完美,因此我需要小小的改动一下,让这个消息能把表情也显示出来。没想到解决表情显示的问题也是如此简单,剩下的就是会话View和聊天View之间的切换了,然后发送消息的实收要构建一个消息模型,然后实时显示出来!问题终究是躲不过呀,我的表情终究没有给我显示出来,这就不科学了呀!

哎,自作多情了呀,MLLable根本也没有这样的黑科技好么,根本就是不好意思说能够直接解析表情,还是得靠YYLable的解析器来实现,看来为还得研究一下表情键盘,在这之前先把会话的假数据和显示出来,至于分组现在就先不管他,以后我决定采用Cell组伸展的方式来搞定这个问题。

执行会话和聊天View翻转的过程中,有一个特别重要的地方,就是我真的创建一开始把两个View都添加上这没有什么难的,甚至在某种程度上,连commonView都不需要了,算了吧,还是需要的,我要做的就是直接让两个View切换层级关系而已,根本就用不着删来删去呀!

现在已经搞定了一切,从会话跳转到私聊,然后从私聊回到会话,我都不在removeView,只是来回切换而已,这样还不用判断空,简直了,下一步就是数据的呈现的问题了。只是这里面的输入框,会话View,聊天View,弄得我好晕呀!而且现在遇到的问题是,我的内存管理又出现问题了,这在呢么行。肯定时会话View的内存没有搞好,怎么会出现这样的问题了,一个会话View坏了一大锅饭!

现在有了一个关键的问题,就是如何刷新会话View的问题,无论怎样,我都该刷新一个模型,然后执行一次加载。把复杂的问题简单化才是我的主题,实现起来,很简单,就是我知道我存储了所有的会话ID,然后根据会话ID找到不同类型的会话,然后加入不同的模型数组,复杂的就是为什么每次都要刷新呢,本地的单例类就是存储了所有的会话ID。除了存储会话ID还有什么用处呢?换句话说,现在怎么造假数据出来,这个太重要了。

问题的关机就是构建私聊会话的模型,至于把模型具体放到那一个数组里去反而不是最重要的,这个太关键了。根据就会话ID找到这个会话,然后获取这个最近20条消息,然后在提取数组的最后一条消息,根据会话ID来对会话进行第一次分类,是系统会话还是私聊会话,然后通过会话的最后一条消息构建模型,然后查看模型的会话对方ID,如果是包含在未关注ID数组里,就把这个模型扔到未关注数组里,否则把这个会话直接显示出来就可以直接显示了。现在就先把所有的会话都放到外面吧,默认都是已近关注状态,然后提取会话构建模型。我觉得自己来构建这个会话模型太慢了,还是先转变成字典,然后打印下来吧,这样就可以获得私聊会会话和系统会爱护啊!

2017.04.12

发现一大问题,当我点击发起直播,确实IM失效了,然后放阿金号都获取下来了才告诉我需要重新登录,那为什么不在点击发起直播的时候就判断这个IM的登录状态,因此我要做的就是子啊点击发起直播的时候就判断IM登录状态。

够爱金私聊会话时候发现,首先管理员和用户的普通消息不好区分。现在我的会话消息的假数据构建完毕就等下一步的展示了。

现在会话的数据也已经搞定,下一步就是构建头像列表的家属觉,这个太关键了,我要默认构建假的头像可,为了让假的头像能够随便滚,我还多弄了几个假头像,非常棒呀!

出现问题了,私聊会话View不仅没有显示,还把我的内存管理给弄乱了,简直了这真的是一个坑呀。现在我先默认就是会话页面不就可以了,哈哈。我不知道是哪里出了问题,从私聊界面到会话界面怎么就把会话界面个移除了呢,简直了,这不科学呀!好奇怪呀,无法添加View,这是什么情况呀,简直了。

现在主要两个问题摆在我面前,第一这个我搞不明白怎么开始出现内存泄露了呢,第二,为什么功能实现不了,应该是我不太聊几天UIView动画的原因,我决定自己手写动画。现在关于功能的问题解决了,剩下的又是内存泄露的问题,太严重了,简直了,怎么能这样呢,干脆我把输入框写成冷信号把,这样就不会出现内存泄露的问题了。

这个问题解决了,原来是在不该layoutSubview的地方执行了layoutSubView方法,这怎么能行呢,自然就是现实错误了。

其实我更发现还有内存泄露的第四种情况,如果我们已经在init方法里声明了一个weakSelf,然后又在订阅者的Block块里面声明WeakSelf。必然会造成内存泄露。

现在我才发现,我根本不能直接读取会话的消息数组,只能读懂模型数组,也就是说我必须把消息数组转变成模型数组,当然我觉得为了消息的模型还是稳定,所以综合可见我还是把这些现在就构建私聊会话的假消息了,决定了,还是通过自己的在会话的消息数组里直接存字典,那多简单呀,直接一句代码就把这些消息字典数组转变成消息模型数组了。

现在遇到一个很大的问题,我居然发现我的私聊的LayoutifNeed居然不产生作用了,就是发现跟本没有这么一个适配的告诉,Lable的高度算不出来,简直了,为什么呢?我不知道,但是现在先不管了。

现在是研究表情还是搞定头像和排名还是弹幕呢,简直任务太多了,现在我决定决定听完最后一首歌,然后就开始进行我的表情切换,这个太重要了。当然学习表情之前,先搞定排名View和头像View。最后再搞定弹幕就可以了。还有礼物界面,简直了,怎么可以这么多功能。还有点赞发爱心,简直了,怎么可以有这么多要做的东西。

2017.04.13

今天继续我的表情处理,这个太重要了,可能也是最耗费我心力的东西,简直了。今天如果能搞定表情和弹幕的问题,就什么都搞定了。简直了,搞定了表情搞定了弹幕,就什么问题都搞定了。

我还想做一个问题就是当我点击我的临时头像时,能够直接网络请求,然后获取此ID的详细资料,这个太重要了,我也可以放到网路层再进行嘛,这个可以缓一缓,到时表情,刻不容缓,解决表情的问题。顺带解决gif动画的问题。

现在已经运行这个自定义表情,表情键盘了,现在应该怎么做才能最快地移植键盘呢,简直了,如何做到内容,简直了,跟本一直键盘,这并不难呀,本质上就是一个多页的collectionView.首先我一般就是去分析这个表情按钮的所有逻辑,然后找出与周围的环境关系,这样就可以知道一切了。

评论的按钮找到了,没有疑问的存在了Cell的点击事件里,这个就太酷了,顺着逻辑链条去做一个最简单的Demo出来,貌似这整个键盘都是三方库呀,不得不说,这些三方库,貌似一说到表情也是使用了YYKit呀。而且最大一个好奇就是这个建盘是如何实现文字输入和表情输入这么快的,简直了,我要把这招学会呀。文字键盘和表情键盘的快速切换。这才是我最大的好奇点。因为说真的,表情键盘我也弄出来,就是感觉很别扭而已!

现在就想弄明白一个问题,如何切换这么块,还有我就的方法了,第一我先分析键盘的响应逻辑,然后把这个键盘单独抽离到Demo中,其二,我拿着问题去想到啥学啥,那种更好,我就先试第一种吧,毕竟脑袋里有问题是个好事情。所以现在开始梳理表情的逻辑链条。

判断键盘触发源是评论还是回复、offset偏移视图、设置chatKeyBoard的placeHolder属性、分析逻辑来,分析去,我觉得梳理逻辑的最快方式,莫过于自己也写一个Demo了,边写边梳理,这样最快了。然后我的键盘就用我写的那个键盘。一直过来,直接添加到控制器上,这样多好啊。然后最好还能够测试UILable实现问题。现在的键盘我就以我写的键盘来搞,首先自然就是建立一个控制器了,然后承载这个输入框和UILable。

私聊的缓存会话真的好慢呀,必须把它爆粗你起来呀,简直了,半天刷不出来,干脆就默认是私聊界面,只有需要的时候进入会话页面。

怎么构建一个Demo都变得这么困哪了,简直了,我必须得像个办法了,创建一个按钮用开启键盘输入,用一个UILable用来显示输入的内容,然后创建阴影返回键盘,妈的,干脆把私聊界面移植过来不就好了,这多幸福。

我靠,这太厉害了,接下来的我做的表情键盘不仅能够解决这个私聊移植的问题,还有同时解决私聊过慢的问题,私聊过慢,唯一的问题就是我的私聊没有本地缓存,我没有本地缓存的唯一原因就是我没有吧私聊会话转变成会话模型数组,不然怎么会坑爹,本质上就是一个刷新的过程吗,我就把私聊会话不刷新,然后点击会话的时候再刷新消息,这样多好,成功的解决了私聊会话刷新过慢的问题,同时,我的私聊还为我接下类的消息移植做出了特别好的封装,简直了,怎么可以这么帅,当然,现在最重要的事情就是做好表情,这个太重了。我就直接把私聊的View搬到Demo控制器之中,这总没有什么问题吧!

现在我一直私聊View没想到这么简单,原来我就是议案加一个View就可以了呀,那么接下来我需要做的就是创建表情键盘,而且一想到内粗你还管理得这么好,我就十分开心呀,现在我要研究的就是别人的表情键盘,然后我可以先网上搜索一些这个三方库,然后看原始的知识出处比一个干巴巴的知识可强多了。

对的呢,我要做键盘,还是非常有必要看一下github当前最先进的键盘长什么样子。然后使用不就行了。把朋友圈都看了一下,有些键盘的有些聊天界面的,就是没有发现有写YYKit表情处理的,看来我还是直接使用中超给我的表情,通过YYkit来解析表情,通过键盘Chat输入表情,关键就是看两个类罢了,有什么难的,简直了。MKLable主要处理点击的问题,而YYLable不仅能够处理Lable点击,更能够显示表情,所有问题的关键就是消化吸收YYKit和表情键盘迫在眉睫。

看了缇天下所有的键盘,还是YYKit写的键盘比较好呀,而且更重要的是居然这么好用,既能够轻松实现键盘的切换,又能够轻松实现表情的发送。当然在研究YYkit之前,我需要先搞定这个秀波的Bug,主要是两点,第一,我需要把消息的私聊View修改掉,需要把关中断的Button修改掉,这才是我当下最重要的东西,必须抓紧时间搞定这一切。

现在我已经修改这个观众端的按钮了,接下来就是搞一下私聊的逻辑,然后添加一个缓存机制,默认都是显示聊天界面,也就是当我有新消息的时候,但是个逻辑不是我今天的重点,而且等我把直播重新抽离出去之后,会更加的美好,这才是我的美好世界,而且,我有一个新的想法,就是让LeanClound和IM通信并存,通过一个宏来实现,这样就可以不耽误原来的逻辑又不妨碍新的IM技术使用!

今天的主题还是最重要的研究YYKit,这才是我的真爱呀,不服不行,所以我就要开始来做点什么了,简直太厉害了。我要把YYKit给消化掉,这估计是我最喜欢的一个三方库了。而且我还有一个大胆的想法,就是我要把动画的gif播放改成YYImage,相信这个YYImage能够带给我超凡的体验,加油!

2017.04.14

今天就是搞定键盘输入框,这个太重要了,我直接一切以YYkit看齐,这个键盘写得是真好,然后以RAC的方式呈现出来,其实键盘的本质上就是一个输入框,这个本身是很容易的,就是我需要以更加流畅的方式呈现出来。

现在我感觉有点吃力了,我到底来学技术还是实现功能呀,我有点迷茫,我感觉的就是以我最小的精力实现代码的改变,这有什么难的呢,可是自己老是喜欢修改别人的代码,不知不觉竟然变成了钻研技术,我对技术根本不感兴趣好么,在所了,我只在乎结果,我只希望我能实现功能,然后对与一个特别好的库,我有必要去纠结这么多么,我就简单一个相反,最小的成本试下最大的性价比,改个WB两个字就很了不起了,然后在写点注释就已经很来不起了,好么?

我觉得这就是一个逐渐瘦身的过程,哪有一步到位的,不都是逐渐缩小的过程么,我先把功能实现,再谈精简代码吧,哪有一上来就要吃透牛的,我做不到,我还是按照最轻松的方式,要啥给啥,也不分类,直接就当三方库来处理,这多好呀!

现在我已经单独把这个表情键盘提取出来了,那感觉是相当好呀,我接下来就是各种DemoVC4和DemoVc5和DemoVC6就是出来首先就是键盘输入框的按钮换成我的键盘输入框,我首先要就是把我的所有的表情都添加进去,首先考虑的就是把当前的表情打包成Bundle文件加载到这个Coolectionview中去,然后在能够随时显示出来。

现在我就要开始处理表情了,感觉好紧张呀,现在要做的就是处理表情了,我的目的就一个。在呢噶几啊一个表情数组,然后显示在键盘下面,这样我的表情就多了一个类型了,这多好呀!

感觉有点凌乱呀,这个YYKit真是不得了,怎么可以这么厉害,简直了,太厉害了。现在我就要处理这个表情和文字的切换了,这个太重要了,直接决定了我的下一步应该如何去走,很简单呀,就是点击切换按钮,由输入框由文字输入变成了表情输入,而且这个输入框我打算也使用YYTextView,这样就可以获得我们的新表情了。

我已经搞定了一切,就是显示的问题,要想直接就在TextView上显示表情,那么我必须将普通的UITextView变成YYTextView,然后稍微修改一下这个TextView的解析器就可以显示表情了。遇到了一个问题耶,现在我已经实现了输入框的表情显示,这已经没什么问题了,现在就是一个使用YYTextView确实能够显示表情了,但是自己发现YYTEXTView是继承UIcorllView,没有RAC事件,所以必须必须把本该RAC的事件,写进YYTextView的事件回调里面了。

2017.04.17

今天怎么了,这么不开心,不就是车等了很久么,几乎都有90分钟在路上了,但是我也没有虚度这段时间呀,我依然有学习呢,这就是我感觉还不错的地方,总的来说,是很开心的,上次已经把表情搞定了,现在我需要继续完成的任务是搞定我的表情展示,这个太重要。

把表情显示在Lable上,我首先要做的就是把我的聊天框的Lable变成一个YYLable了遇到的首要问题就是如何让MKLable的可点击和YYLable的可展示表情能够同时存在,这个就足以让我激动一下了,上午就把这个搞定吧!就相爱私聊吧,至于输入框,我就不改了,毕竟用户不一定知道表情的准确意义!

所以现在就是聊天界面的Lable改成YYLable,同时研究YYLable示例的点击事件,还有我需要研究一下解析器,弄明白其中的逻辑,然后评估是否我需要把这个表情的Plist表的表情对应意义前面的#给删除掉!

本身我的模拟数据里面是有表情文字的,我只要建立一个YYLable就可以完美展现这些表情,而且刚才我说什么把表情Plist文件的表情对应文字修改了,这直接回造成历史遗留问题呀,比如说安卓端和iOS端互相不认可!

YYLable直接就是继承自UIView,这意味着我可以直接在Cell里面引入YYLable头文件就可以了。

有什么难的,直接把MkLable改成YYLabel就可以了呀!根本不是什么问题。现在有两个问题,第一个问题我还可以放一放,就是说有是个表情我找不到图片,因此我显示不出来,我不知道什么原因,是找不到图片还是解析不了,我的看一下,更重要的是,如果我不过滤#的表情那么显示在Lable上的表情前面就会显示一个#号,其实我现在纠结的是,这样如果我用现成的解析器,那么安卓发给我表情文本,我只会把#后面的文字变成表情,#号并不会变成表情,同时我传给安卓的时候,安卓解析一个表情,必须是#和后面的文字一个整体,那么我现在发的单独一个文字过去,很有可能对方解析不了,这就是差距。所以我必须考虑的是否研究一下秀波的解析器,然后把那个秀波的解析融入到的闲杂键盘之中,在这之前, 我要解决两个问题,一个是显示不出来的表情,到底是显示不出来还是图片存在。我刚才遍历我发现有这张图,只是显示不出来罢了,那么这意味着我能显示出来的表情是因为我的这个表情在别的表情包出现过。

现在我已经把图片重新编辑了一次,问题依然,我始终怀疑,解析器没有吧秀波的表情存入解析器中,所以解析不出来,如何验证这一点呢,要么我通过图片解析器去看,首先是输入框判断这是一个图片,然后呢,我就需要去判断这个文字是如何编变成图片的,这个太关键了,怎么就变成图片了呢?文本怎么就变成图片了呢?我看了YYTextView,死活搞不清楚是如何将文本变成了图片的,怎么就变成了图片呢,好烦呀!是在不行我行做另一个测试,我把秀波里面的马上有对象写到泰达里面去,把图片也拉过去,凡是显示不出来的,通通拉到泰达里面去,然后把所有的文本前面都加上一个#,看能否识别,干脆就先加一个#号吧,看泰达里面的#号能偶被解析到还是直接显示出#号,如果是显示#号,说明这个解析器是固定的,如果是不显示图片,说明是动态解析器,那就简单了,直接把所有的表情标题前都加上#号就可以了。当我突然给表情标题加一个#果然不识别了!说明是动态解析的,只是可能我一旦用了#号,系统自动就把#给当成字符了,这样就不科学了,这说明我的解析器不识别#号只识别[表情],这说明我的表情解析有一个。现在我们烦人解析器就统一了,以后发的表情都没有#号了,直接就是[表情],这样我发出去的是[表情],接收的也是[表情]直接解析器就能读取,简直不要太幸福!首先把剩余8个字典移植过来,然后就是把图片移植到泰达里面,这样所有的都可以读取了,好幸福,但是不要剪切用复制就行!然后我发现一个问题耶,为什么原本通过哪种#来读取表情,其实是因为泰达的表情没有我们秀波的表情好呀,所以才秀波自己做了一套表情,然后就是直接就解析了。

现在的我好迷茫呀,我点击的表情和我显示的表情不一样,现在我陷入深深的迷茫,有一个很大的问题就是同一个标题可能对应两中文字,这该如何是好呀,简直了,啃爹呀!私聊到时没有问题了,可是群聊的名字点击在怎么办?换句话说,如何通过YYLable实现群聊名字的点击,这个太重要了。

现在我在创建群消息的时候,当我吧解析器加上的时候,我发现一切都不好了,虽然把表情显示出来了,其它的什么都显示不出来了,这不科学呀。那我应该借鉴当初一飞使用YYLable的经验,来处理这个问题,首先这是一个什么问题呢,我都有点懵!

现在好坑呀,我用原生的表情解析器,发现我的颜色设置不管用,如果我用自己写的解析器吧,又提取不到图片,简直了,怎么这么坑!

2017.04.18

首先我想要把微信表情给加上。然后就是一个表情解析、然后就是屏幕点赞、然后就是单机礼物、然后就是特效礼物。

终于把颜色搞定了,原来我是有思维误区呀,以后碰到问题不要发脾气,好么,你就打断点,一点一点地看,先找出问题来呀,很多时候,你自己都根本不清楚好么!

现在添加弹幕,现在我系那个继承BarrageView做一个自己的弹幕View,这个太重要了,这然后就能够处理了。我局的写一个子类很有必要呀,尤其是处理内存的问题。弹幕的问题很大,我需要权衡评估后在行动,我先把礼物加载上吧!

首先实现屏幕点赞

2017.04.19

先把礼物逻辑搞定吧,这样就能够这样我发来的消息能偶进入处理逻辑,另外把弹幕搞出来,下午就可以吧View往直播里面搬了,搬完了View就可以着手处理网络层和逻辑层了。

所有的直播Demo都跑不起来,那就不是我的问题了,肯定是Xcode升级之后造成的静态库问题,也确实呀,这个腾讯的主页的配置都已经改了,把静态库的类型都改了,肯定就不是我的问题了呀。

2017.04.24

今天的上班没有什么进展,业余的兼职确实要求我重新把直播管理一番,我需要把YYKit给去掉,然后换成MLLinkLable,不难实现,我只需要先把YYKit三方库从Pod删掉,然后把用到YYkit的地方全部通过MKLable来实现,这一点也不难,问题是,我的改动不是一个小工程,需要我换一种思路来处理,比如说到底是替换成MLLable还是换成YYText,如果从使用来讲,还是换成YYText使用价值更高呢!

发现你当我使用YYText之后,即时我已经把表情键盘删除,但是依然无法刷新群聊的Cell,这就不科学了,怎么会这样!

2017.04.25

这个计算可气死我了,简直了,怎么回事,我怎么效率这么低,简直了,我已经无力吐槽,我花了至少六个小时了把,但是得到的结果呢,这么糟糕,简直了,我很尽力了呀,我就不明白了,怎么会这么糟糕,实在让我无力吐槽,我要作什么呢,现在当然是打包成静态库,对了,这就是我今天需要做的事情,没有什么事情比这个更加重要。

现在我就需要搞定这个事情了,简直了,怎么回事儿,心情怎么这么不好呢,都怪这个计算,太伤人了,这么动脑经,效率却如此之低,简直不能忍呀,有没有,怎么回事儿,我都心好塞,但是今天的任务还必须得完成,振作起来,简直了,怎么这么坑爹。

首先就是SDK的注册

2017.05.31

我就想把百度云盘的视频的播放链接抓取下来,然后下载到手机里面,这样我的时间就能得到充分的利用了,如此一来就能获取到自己成长,顺便把我的百度云盘清理下来,而且更重要的是,这个事情一旦成功,我将可以不用再考虑每天都更新Plist这个问题了。

所以首先就是打开我的百度云盘了。

FTP电脑作为服务器,手机联网进行观看。

2017.06.05

既然我还在这个位置上,那么我就得好好干,就算是明天死去,今天也得认真,可能我现在的积累与我的人生规划稍有偏差,但是动脑筋这一点永不会变,今天做什么呢,事情还挺多,原本是说把买的教程看完,突然来了一个添加View的任务,这并不难呀,只是自己很在意这个充值的逻辑跳转,必须通过View来实现,毕竟,我的播放界面和交互界面本质上全是View,那就必须得把这个充值逻辑也转变成View,除此之外,别无其他。

为了更加完善这个界面的丰富性,建造一个直播结束后的界面展示同样重要,问题关键如何识别当前的直播已经停止了,通过SDK的回调,通过消息的回调、两种方式,还是消息最可靠,那么我就更得把消息的逻辑又梳理一遍,这简直就是没完没了呀,直播的业务逻辑之复杂,在于任何一个逻辑其实都是相对于两个手机来讲的,还有,自己的直播分享什么时候来做,也是一个大问题,如何向别人讲清楚我直播的套路。

曾经一时兴起把直播的PPT都想好了,可是后来因为种种原因又耽搁了,现在我就算明天死去,那也要把今天的直播逻辑梳理出来方便后面的人理解呀,毕竟,这一年里,我对于直播的成长和心得多不胜数,可是脑袋又总在想,这有什么意思,这是什么鬼,怎么会产生这种问题,无法精进提高,这对于我来说,绝对不是一件好事,现在的我陷入迷茫,这是一件很不科学的事情,可能是真的把业余时间的能量释放出去了吧,反倒是自己的上班时间一时察觉不到意义,这就是精力的重心的调整么。

还有,最近怎么老是想要社交,这不符合我的人生逻辑呀,毕竟我是有梦想的人,管别人的呢,自己做好自己的事情,就是大家都不喜欢我,只要自己觉得自己的事情对自己有意义,对别人有价值,大不了辞职就行了呀,反正我回到四川的生活肯定不会比现在差,好久我都没有孤单过了,真是不习惯一群人的喧哗,静静的来,静静地去,不泛起一片涟漪。

越来越发现,我所有的成长皆是因为一个吸引,我努力表现自己,只为那些更我志同道合的人能够发现我,走近我,仅此而已,可是现在,我竟然慢慢沉溺于工作岗位上,思考人生格局的时间越来越少,一方面是因为压力,而另一方面则是因为自己的人生新追求,工作的时间里,我总得创造点什么,可是创造点什么呢,现在确实完成产品的需求什么的通通不在话下,可是对于一些基础的知识自己貌似并不理解吧,我能做的就是一个学习思考实践学习思考实践呀,仅此而已。就像我今天再去看我大四时候的Flash和网站制作,简直受益终生呀,我当下知道一件特别有意思的事情,就是把自己的Demo往githab上传,然后自己将造一个超级博客,然后自己就可以实现自己的内容超级自定义。试想一下,现在自己学会建立一个博客,简直比学技术学新语言还要受益终生呀,这种能力是我将来无论做什么都能用到的能力,还能收获到女生的崇拜,还有比这更酷的事情么?

无论我现在是把Demo往github上传,还是给自己建一个超级博客,写那种高大上的内容,都是值得我用心去学习的呀,至于技术可以先发放一放嘛!还有,努力去研究一些程序员使用的好工具,这也是受益终生的事情呀,关键是你得明白什么知识比较酷,什么知识比较没有趣味,知识还是那个知识,一旦你找到了知识的用途,马上知识就会变得有趣,如果只是纯粹的强迫自己学习,那么你最后绝对是事倍功半,吃力不讨好,还是写日记管用,让我找到了努力的方向,就像学习markdown那样,造一个PPT会画图形可能真的是比会什么技术还要有趣还有重要呢。所以我得学会用工具,比其它技术什么的简直重要太多了。

建博客、写文章、画图形、传代码、视频特效。忙得不亦乐乎,怎么就会没有事情做呢,简直了,只有做事情才会有成长,只有成长才会让我感觉生活有趣,有趣可比有钱重要多了,大学的时候,没有钱,但是那时候是真的很快乐呀,我就是觉得,自己又会一项技能,还有什么比这更有趣的事情呢。曾经就说过要做一个特效视频,后来也就淡忘了,但是当时自己出去玩,机缘巧合竟然不知不觉搞定了,这就是思考的力量,你的想法一定要大胆但是一定不要触碰底线,真的,凡是我想过的,最后都是实现了。从未有过例外,我只需要做一件事情,不断的想,然后不断地创造。

话说回来,上午还是需要先搞定秀波的两个新View,然后从下午开始就处理搭建博客的事宜,先查资料,找一个好的博客的样子。这次安徽泗最重要的一步,构建愿景。

中午吃饭又把上嘴唇咬破了,可能这就是右眼皮一直跳的原因吧,早上还把一个女生的鞋子踩掉了,这是不科学的,当时我觉得离得很远呀,我怎么就把鞋子给踩上了呢,最近我也没做什么不对的事情呀,上帝你请给我明示,这根本不科学呀,而且我一来就说我上月12号没有打卡,这也不科学呀,我怎么会忘记打卡呢,而且还需要我主动讨好人际关系,这根本不符合逻辑呀,果然写日记能偶剖析自己的内心,让自己处于愉快的心境,为什么自己会感觉今天不开心,很大程度上是自己的内心决定的。

推荐阅读更多精彩内容