对于首页的优化
当前页面中存在的问题
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,
此外,需要进一步实践的
踩坑记录
问题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(...)
Copyright © 2015 Powered by MWeb, Theme used GitHub CSS.