fastlane相关

Read more   2018/7/25 posted in  codeDaily

最大值连续子序列

Read more   2018/7/25 posted in  编程

对于首页的优化

当前页面中存在的问题

switch model.style {
case .news: 
    let cell = tableView.dequeue("newsCell") //config
    //...配置
    return cell
case .video:
     let cell = tableView.dequeue("videosCell") //config
    //...配置
    return cell
case .pic:
     let cell = tableView.dequeue("picsCell") //config
    //...配置
    return cell
case .beauty:
     let cell = tableView.dequeue("beautyCell") //config
    //...配置
    return cell
case .bigImage:
     let cell = tableView.dequeue("bigImageCell") //config
    //...配置
    return cell
default: ...
}

实际页面涉及到的cell种类不止这些,并且在未来的开发过程中会随着app特性的增加而增长,因为每次需要维护和更新时对整个大的代码块进行修改就编程一个非常杂乱的过程,稍有不慎还会影响整体的逻辑。那这里我们需要利用协议的特性进行设计。相关参考

实际项目中定义了一个协议,用来表示整个的数据类型

protocol ParseMessageType{
    associatetype: Original
    associatetype: ParseResult
}

Original->ParseResult的转换步骤通过一个 parser来完成, 叫做MessageParser

protocol MessageParser {
 
 associatetype: Message
 associatetype: Target: ParaseMessageType where Message == Target.Original
    func parse(messgae: Message)-> Target.ParsedResult
}

对于Target遵守 ParaseMessageType 的协议, 并且它的 original和message一致, 这就对parse方法的返回值进行了限定,编译过程中进行类型检查时会进行严格的类型匹配。

在具体MessageType实现的过程中

final class ParsedChatMessage: ParsedMessageType {
    let output: NSAttributedString
    let original: ChatMessage
    
    init(message: ChatMessage){
        original = messgae
        let parser = Parser()
        self.output = parser.parse(message: message)
    }
}

struct Parser: MessageParser {
    typealias Target = ParsedChatMessage
    func parse(message: ChatMeaasge)-> NSAttributeString {
     let reuslt = ...
     return .init(attributedString: result...)
    }
}


那么实际中的本地效果呢:

FeedModel IndexProtocol cellViewModel1 cellViewModel2cellViewModel3

在 feedModel,
在feedModel中实现fakeModel
FeedModel-> IndexProtocol
fakeModel-> IndexProtocol
TopicModel -> IndexProtocol

对应的不同的cell,

此外,需要进一步实践的

delegate改进

2018/7/25 posted in  iOS

首页的优化记录

记录一个复杂页面的优化过程

Read more   2018/7/24 posted in  codeDaily

ObjectMapper学习

ObjectMapper
最近在写Mirror的时候,一直在考虑如何自动实现JSON 与Object之间的解析与赋值问题,而不需要手动进行key值的配置。因此对于当前Swift中常用的几个框架比较好奇。因此我打算解读一下 ObjectMapper是如何实现的。。

Read more   2018/7/21 posted in  iOS

Swift中的反射 Mirror (上) 认识和基本使用

Read more   2018/7/21 posted in  iOS

随想系列(-)

最近走上上班的路上,常常会触发一些联想。这可能就是乱七八糟的书多了,就会触发跨区域的传输。

今天思考了个问题, 人为什么要学习呢?
最近两天也在刷算法的一些问题。发现很多问题的解决确实是需要一些奇思妙想,这些天马行空的思想需要一个卓越的大脑来实现。然而大部分算法的实现都是有套路的。作为普通劳动力里的我,也就只能通过不断的接触和实践才能慢慢掌握。
这里就把解题的人分为两种类型:聪明人和平庸的人。
针对一个问题,聪明人可能直接给出答案,平庸的人呢,要针对给出的细节,进行反复的思考。
这里就体现了不同的人,他的思维深度和广度。
思维的深度指的是,针对一个一些底层条件和细节,是否能够推断出高层次的结论,进而由这些高层次的结论,推断出想要的结果。 这个已知条件实现的“升级”,也就是我们平时常说的知识点了。对于不了解这些知识点的人,对于那些底层的细节,也都是束手无策的。
我又想到以前讨论的很火热的一个问题”现在搜索软件已经这么方便了,可以直接在网络搜索我需要的结果,那我还要花时间学习,有必要吗?“ 我的结论是——非常有必要。
coursera上有一门课程,叫做《Learn How to learn》, 里面介绍了学习知识的一种理论: 我们学习的东西在大脑中就是一个点,与该知识相关的知识就是另外一个点,当我们学习并深化之后,两个点就会建立一个连接,在大脑思考问题时,考虑到某个点,就很自然的通过连接到达其他的相关知识点。这就是推论、联想。连接是可以通过不断的思考,练习来强化的。这样,随着点的越来越多,连接的越来越多,最终形成了牢固的知识体系。我们在考虑一个问题的时候,可以藉由这个知识网络到达体系内的任意一点。这也代表了在某一个领域内的广度和深度。而这一点是很难通过网络引擎来替代。
回到解题的问题上来,知识体系丰富的人,对于现有的条件,很容易在网络中寻找相关的信息,利用这些相关信息来处理问题。而体系狭窄,萎缩的人,想破脑袋也很难想的出来,临时使用搜索引擎,针对相关的知识进行学习,其挑选、吸收的过程就需要很大的成本。

我当前希望自己做的,就是不断强化和延伸这样的知识网络。

第二个想法呢, 每天做一件让自己赞叹的事情吧。让自己的一天显得与众不同。
第三个想法呢 克服习惯的惯性,克服欲望。完成一个完整的流程,好好的做完一件事。

2018/7/18

WWDC 2018 Swift 4.2 新特性

Read more   2018/6/6 posted in  iOS

踩坑记录

问题1 使用 Leaks检查项目内存泄漏,崩溃的问题

问题描述

进入Leaks模拟器或者真机app,进入30s左右就出现崩溃的现象,但是正常运行app没有问题

参考资料
最后找到解决方案:
进入leaks之后,在开启任务前,
通过操作file -> recordOptions -> recordCount 取消选择

问题2 对于约束的判定

应用场景: 一个superview 加入 一个子view-UITableView。
在后续需要找到tableView的顶部约束并改变其值,使之发生改变。

  self.view.constraints.foreach { (const) in
    if const.firstAttribute == NSLayoutAttribute.top.
        let view = const.firstItem as? UITableView,
            view = self.tableView {
            //TODO: 此处已识别,do sth
            }
  }

在这对关系中 const中的item1是UITableView,item2是superView
由于tableView的位置需要通过 superView来进行确定。
在最初添加约束时, superView.addConstraints(...)

2018/6/6 posted in  codeDaily

Xcode提速

如何更加快速的使用Xcode

Read more   2018/3/13 posted in  iOS