Commit 715aa40e7d229aeaf0c9a7f401c397bf792953cd

Authored by “张旭”
1 parent e59136b8

认证下滑页getpage增加数据库 , 每次启动时重置会更新getpage时更新数据库

... ... @@ -71,6 +71,9 @@ target 'metaCode' do
71 71 #网页交互
72 72 pod 'WebViewJavascriptBridge'
73 73  
  74 + #数据库
  75 + pod 'FMDB'
  76 +
74 77 #依赖三方私有库,如果里面有.a的时候加上这个
75 78 pre_install do |installer| Pod::Installer::Xcode::TargetValidator.send(:define_method, :verify_no_static_framework_transitive_dependencies) {}
76 79 end
... ...
metaCode.xcodeproj/project.pbxproj
... ... @@ -105,6 +105,8 @@
105 105 1965FA3E2AFB176E00F0F435 /* CNLiveShopAddGoodsSingleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1965FA3D2AFB176E00F0F435 /* CNLiveShopAddGoodsSingleView.swift */; };
106 106 1965FA402AFB38AA00F0F435 /* CNLiveAddGoodsSelectUploadImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1965FA3F2AFB38AA00F0F435 /* CNLiveAddGoodsSelectUploadImageView.swift */; };
107 107 1965FA422AFB79EA00F0F435 /* CNLiveGoodsCategoryController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1965FA412AFB79EA00F0F435 /* CNLiveGoodsCategoryController.swift */; };
  108 + 197325D22BB11C18002E41A3 /* DatabaseManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 197325D12BB11C18002E41A3 /* DatabaseManager.swift */; };
  109 + 19AB90642BB412C700B6A79B /* CNLiveDownslideOperationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19AB90632BB412C700B6A79B /* CNLiveDownslideOperationManager.swift */; };
108 110 19AD65AA2BA041210045A444 /* CNLiveGoodsDetailsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19AD65A92BA041210045A444 /* CNLiveGoodsDetailsTableViewCell.swift */; };
109 111 19AD65AC2BA16CF20045A444 /* CNLiveShopCommentRequestShareModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19AD65AB2BA16CF20045A444 /* CNLiveShopCommentRequestShareModel.swift */; };
110 112 19AD65AE2BA177C20045A444 /* CNLiveShopGoodsDetailsTableHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19AD65AD2BA177C20045A444 /* CNLiveShopGoodsDetailsTableHeaderView.swift */; };
... ... @@ -372,6 +374,8 @@
372 374 1965FA3D2AFB176E00F0F435 /* CNLiveShopAddGoodsSingleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopAddGoodsSingleView.swift; sourceTree = "<group>"; };
373 375 1965FA3F2AFB38AA00F0F435 /* CNLiveAddGoodsSelectUploadImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveAddGoodsSelectUploadImageView.swift; sourceTree = "<group>"; };
374 376 1965FA412AFB79EA00F0F435 /* CNLiveGoodsCategoryController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveGoodsCategoryController.swift; sourceTree = "<group>"; };
  377 + 197325D12BB11C18002E41A3 /* DatabaseManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatabaseManager.swift; sourceTree = "<group>"; };
  378 + 19AB90632BB412C700B6A79B /* CNLiveDownslideOperationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDownslideOperationManager.swift; sourceTree = "<group>"; };
375 379 19AD65A92BA041210045A444 /* CNLiveGoodsDetailsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveGoodsDetailsTableViewCell.swift; sourceTree = "<group>"; };
376 380 19AD65AB2BA16CF20045A444 /* CNLiveShopCommentRequestShareModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopCommentRequestShareModel.swift; sourceTree = "<group>"; };
377 381 19AD65AD2BA177C20045A444 /* CNLiveShopGoodsDetailsTableHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopGoodsDetailsTableHeaderView.swift; sourceTree = "<group>"; };
... ... @@ -809,6 +813,7 @@
809 813 1938BD482B512C5800390A34 /* DownSlide */ = {
810 814 isa = PBXGroup;
811 815 children = (
  816 + 197325D32BB3B40F002E41A3 /* CNLiveDownslideOperationManager */,
812 817 7CD6753B2A2740B0008354C1 /* CNDownSlideView.swift */,
813 818 7CD6753A2A2740B0008354C1 /* CNDownSlideViewRemindView.swift */,
814 819 19FA20162AE22D3C001F7186 /* CNLiveDownSlideRecommendCell.swift */,
... ... @@ -940,6 +945,22 @@
940 945 path = GoodsManager;
941 946 sourceTree = "<group>";
942 947 };
  948 + 197325D02BB11BFD002E41A3 /* DatabaseManager */ = {
  949 + isa = PBXGroup;
  950 + children = (
  951 + 197325D12BB11C18002E41A3 /* DatabaseManager.swift */,
  952 + );
  953 + path = DatabaseManager;
  954 + sourceTree = "<group>";
  955 + };
  956 + 197325D32BB3B40F002E41A3 /* CNLiveDownslideOperationManager */ = {
  957 + isa = PBXGroup;
  958 + children = (
  959 + 19AB90632BB412C700B6A79B /* CNLiveDownslideOperationManager.swift */,
  960 + );
  961 + path = CNLiveDownslideOperationManager;
  962 + sourceTree = "<group>";
  963 + };
943 964 19BB1FE42AEB93850094D962 /* Model */ = {
944 965 isa = PBXGroup;
945 966 children = (
... ... @@ -1156,6 +1177,7 @@
1156 1177 798A44F32A3077ED00815935 /* CustomView */,
1157 1178 790D01832A2D89E100C5978D /* Extensions */,
1158 1179 796398912A260C0100D045EB /* Common */,
  1180 + 197325D02BB11BFD002E41A3 /* DatabaseManager */,
1159 1181 796398922A260C0100D045EB /* Config */,
1160 1182 796398902A260C0100D045EB /* Main */,
1161 1183 7963988B2A260C0100D045EB /* Other */,
... ... @@ -1906,8 +1928,10 @@
1906 1928 790D019A2A2DCAE400C5978D /* CNLiveViewController.swift in Sources */,
1907 1929 191733192B10A05D007BCC04 /* CNLivePlayerProgressView.swift in Sources */,
1908 1930 79803E272AD68D3100F05F68 /* CNLiveMineShopViewController.swift in Sources */,
  1931 + 197325D22BB11C18002E41A3 /* DatabaseManager.swift in Sources */,
1909 1932 79803E292AD6991200F05F68 /* CNLiveMineInputMessageView.swift in Sources */,
1910 1933 79282A462A2F457D00B5F8CF /* CNLiveMineViewController.swift in Sources */,
  1934 + 19AB90642BB412C700B6A79B /* CNLiveDownslideOperationManager.swift in Sources */,
1911 1935 7991723A2AF091E100DC01A8 /* CNLiveShopOrderListViewController.swift in Sources */,
1912 1936 798A44F02A305BC200815935 /* UIButton+CNLiveExtensions.swift in Sources */,
1913 1937 1938BD342B4B968300390A34 /* CNLiveHomePageDuanJuCell.swift in Sources */,
... ...
metaCode/Classes/DatabaseManager/DatabaseManager.swift 0 → 100644
  1 +//
  2 +// DatabaseManager.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2024/3/25.
  6 +//
  7 +
  8 +import FMDB
  9 +import HandyJSON
  10 +
  11 +class DatabaseManager {
  12 + private let dbQueue: FMDatabaseQueue
  13 +
  14 + init(filePath: String) {
  15 + let databasePath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
  16 + let filePathStr = "\(databasePath)/CNLiveDownSlideModelDataBase.db"
  17 +// print("2222222:\n\(filePathStr)")
  18 + self.dbQueue = FMDatabaseQueue(path: filePathStr) ?? FMDatabaseQueue()
  19 + // 在这里调用创建表的
  20 + self.createTable()
  21 + }
  22 +
  23 + func hasDataInTable() -> Bool {
  24 + // 查询一行来确定是否有数据
  25 + var isHaveData = false
  26 + dbQueue.inDatabase { db in
  27 + let sql = "SELECT * FROM CNLiveDownSlideModelDataBase LIMIT 1" // 查询一行来确定是否有数据
  28 + let results: FMResultSet? = db.executeQuery(sql, withArgumentsIn: [])
  29 + isHaveData = results != nil && results!.next() // 如果 results 不为空且至少有一行数据,则返回 true
  30 + }
  31 + return isHaveData // 如果 results 不为空且至少有一行数据,则返回 true
  32 + }
  33 +
  34 + // 创建表(如果表不存在)
  35 + func createTable() {
  36 + dbQueue.inDatabase { db in
  37 + if !db.executeUpdate("CREATE TABLE IF NOT EXISTS CNLiveDownSlideModelDataBase (blockId INTEGER PRIMARY KEY AUTOINCREMENT,id INTEGER,timeStamp INTEGER, isGetPage INTEGER,json_data TEXT)", withArgumentsIn: []) {
  38 + print("Error creating table: \(db.lastErrorMessage())")
  39 + }
  40 + }
  41 + }
  42 +
  43 + // 保存模型(增)
  44 + func saveModel(_ models: [CNLiveDownSlideModel]) {
  45 + self.dbQueue.inTransaction { db, rollback in
  46 +
  47 + do {
  48 + for slide in models {
  49 + let jsonData = try slide.toJSONString()
  50 + let insertSQL = "INSERT INTO CNLiveDownSlideModelDataBase (blockId,id,timeStamp,isGetPage, json_data) VALUES (?,?,?,?,?)"
  51 + if db.executeUpdate(insertSQL, withArgumentsIn: [slide.blockId ,slide.id,slide.timeStamp,0, jsonData ?? ["":""]]) == true{
  52 +// print("2222222save succ")
  53 + }else{
  54 +// print("2222222save fail")
  55 + }
  56 + }
  57 + } catch {
  58 + rollback
  59 + }
  60 + }
  61 + }
  62 +
  63 + // 更新模型(改)
  64 + func updateModel(_ models: [CNLiveDownSlideModel]) {
  65 + self.dbQueue.inTransaction { db, rollback in
  66 + do {
  67 + for slide in models {
  68 + let jsonData = try slide.toJSONString()
  69 + let updateSQL = "UPDATE CNLiveDownSlideModelDataBase SET json_data = ? ,id = ? , isGetPage = ? ,timeStamp = ? WHERE blockId = ?"
  70 + if db.executeUpdate(updateSQL, withArgumentsIn: [jsonData ?? ["":""],slide.id,0,slide.timeStamp ,slide.blockId]) == true{
  71 +// print("2222222Succ updating model,blockId\(slide.blockId)")
  72 + }else{
  73 +// print("2222222Error updating model")
  74 + }
  75 + }
  76 + } catch {
  77 + rollback
  78 + }
  79 + }
  80 + }
  81 +
  82 + // 更新表中所有记录的 isGetPage属性
  83 + func updateIsGetPage(isGetPage: Int){
  84 + let updateSQL = "UPDATE CNLiveDownSlideModelDataBase SET isGetPage = ?"
  85 + self.dbQueue.inTransaction { db, rollback in
  86 + if db.executeUpdate(updateSQL, withArgumentsIn: [isGetPage]) == true{
  87 +// print("2222222Succ updating model")
  88 + }else{
  89 +// print("2222222Error updating model")
  90 + }
  91 + }
  92 + }
  93 +
  94 + // 删除模型(删)
  95 + func deleteModel(withID id: Int64) {
  96 + self.dbQueue.inTransaction { db, rollback in
  97 + let statement = "DELETE FROM CNLiveDownSlideModelDataBase WHERE id = ?"
  98 + if db.executeUpdate(statement, withArgumentsIn: [id]){
  99 + print("Success deleting model")
  100 + }else{
  101 + print("2222222Error deleting model")
  102 + }
  103 + }
  104 + }
  105 +
  106 + // 查询所有模型(查)
  107 +// func fetchAllModels() -> [CNLiveDownSlideModel] {
  108 +// var models: [CNLiveDownSlideModel] = []
  109 +// self.dbQueue.inDatabase { db in
  110 +// if let results = try? db.executeQuery("SELECT * FROM CNLiveDownSlideModelDataBase", withArgumentsIn: []){
  111 +// while results.next() {
  112 +// let model = CNLiveDownSlideModel()
  113 +// model.pageId = Int(results.int(forColumn: "id"))
  114 +// let slideModelJSONStr = results.string(forColumn: "downSlideJSONStr")
  115 +// models.append(model)
  116 +// }
  117 +//
  118 +// }
  119 +//
  120 +// }
  121 +// return models
  122 +// }
  123 +
  124 + // 根据ID查询模型(查)
  125 + func fetchModel(withID id: Int64) -> [CNLiveDownSlideModel]? {
  126 + var models: [CNLiveDownSlideModel]?
  127 + self.dbQueue.inDatabase { db in
  128 + let results = try? db.executeQuery("SELECT * FROM CNLiveDownSlideModelDataBase WHERE id = ? ORDER BY timeStamp ASC", withArgumentsIn: [id])
  129 + var tempModels = [CNLiveDownSlideModel]()
  130 + while results?.next() == true {
  131 + if let jsonData = results!.data(forColumn: "json_data"){
  132 + if let jsonResult = try? JSONSerialization.jsonObject(with: jsonData, options: []) as? [String: Any] {
  133 +// print("转换成功,jsonResult: \(jsonResult)")
  134 + // 在这里,jsonResult就是转换后的Dictionary<String, Any>
  135 + let res = jsonResult
  136 + let slide = newDictionaryToModel(res, CNLiveDownSlideModel.self) as! CNLiveDownSlideModel
  137 + if let isGetPage = results?.int(forColumn: "isGetPage"){
  138 + slide.isGetPage = Int(isGetPage)
  139 + }else{
  140 +
  141 + }
  142 + tempModels.append(slide)
  143 + } else {
  144 + print("2222222转换失败,无法转换为字典")
  145 + }
  146 +
  147 + }else{
  148 + print("2222222jsonData fail")
  149 + }
  150 +
  151 + }
  152 + if tempModels.count > 0{
  153 + models = Array(tempModels)
  154 + }
  155 + }
  156 + return models
  157 + }
  158 +
  159 + // 其他数据库操作方法可以在这里继续添加...
  160 +}
  161 +
... ...
metaCode/Classes/Main/HomePage/Controller/DownSlideController/CNUpSlideViewController.swift
... ... @@ -59,10 +59,58 @@ class CNUpSlideViewController: CNLiveBaseViewController,UITableViewDelegate,UITa
59 59 }
60 60 set{
61 61 _downPath = newValue!
62   - self.getPageApi()
  62 +
  63 + let databaseManager = DatabaseManager(filePath: "")
  64 + // 检索数据
  65 + var newDataArr = databaseManager.fetchModel(withID: Int64(newValue!) ?? 0)
  66 + if (newDataArr != nil){
  67 +
  68 + //查询isGetPage是否为1 true
  69 + if newDataArr?.first?.isGetPage == 1{
  70 + //请求getpage后更新本地数据库
  71 + let operation = BlockOperation { [weak self] in
  72 + //网络请求
  73 + self!.getPageApi(isUpdateDB: true)
  74 + }
  75 + CNLiveDownslideOperationManager.shared.addDownslideOperation(operation: operation)
  76 + }else{
  77 + //不更新本地数据库
  78 +
  79 + }
  80 +
  81 + self.dataArray.removeAllObjects()
  82 + self.dataArray.addObjects(from: newDataArr!)
  83 + if self.idModel?.id == 6{
  84 + //幼教中国,请求我的课程接口
  85 + self.getYjzgMyCurriculumApi()
  86 + let firMdl = self.dataArray.firstObject as! CNLiveDownSlideModel
  87 + if firMdl.type == SlideModelTypeTodayRecommend74{
  88 + self.isFirstMyCurriculum = false
  89 + }else{
  90 + self.isFirstMyCurriculum = true
  91 + }
  92 + }else{
  93 + self.tableView.reloadData()
  94 + }
  95 + }else{
  96 + let operation = BlockOperation { [weak self] in
  97 + //网络请求
  98 + self!.getPageApi(isUpdateDB: false)
  99 + }
  100 + CNLiveDownslideOperationManager.shared.addDownslideOperation(operation: operation)
  101 + }
  102 +
  103 +// self.getPageApi()
63 104 }
64 105 }
65 106  
  107 + /// 获取十位时间戳
  108 + func getTimeStamp()->Int{
  109 + let timeInterval: TimeInterval = NSDate().timeIntervalSince1970
  110 + let timeStamp = Int(timeInterval)
  111 + return timeStamp
  112 + }
  113 +
66 114 // MARK: - 懒加载
67 115 ///数据源
68 116 lazy var dataArray: NSMutableArray = {
... ... @@ -265,24 +313,38 @@ class CNUpSlideViewController: CNLiveBaseViewController,UITableViewDelegate,UITa
265 313 return 0
266 314 }
267 315 //MARK: - 网络请求获取详情页
268   - func getPageApi()
  316 + func getPageApi(isUpdateDB:Bool)
269 317 {
270 318 // showLoading(message: "")
271 319 CNLiveDownSlideViewModel.requestGetPage(pageId: _downPath! as NSString) { result, status in
272 320 hiddenLoading()
273 321  
274 322 if status == .success{
  323 + // 假设你有一个 CNLiveDownSlideModel 实例要保存
  324 + let databaseManager = DatabaseManager(filePath: "")
275 325  
276 326 self.dataArray.removeAllObjects()
277 327 let array = result as! [Any]
278 328 let newDataArray = NSMutableArray()
  329 + var index = 1
279 330 for slideModel in array {
280 331 if let model = slideModel as? CNLiveDownSlideModel{
281   -
282 332 let layout = CNLiveDownSlideModelLayout.init(model: model)
283   - newDataArray.addObjects(from: [layout.getCellHModel()])
  333 + let newSlideModel = layout.getCellHModel()
  334 + newSlideModel.id = Int(self.downPath!) ?? 0
  335 +
  336 + let timestampIdx = index
  337 + newSlideModel.timeStamp = timestampIdx
  338 + print("timeStamp:\(timestampIdx)")
  339 + index = index + 1
  340 + newDataArray.add(newSlideModel)
284 341 }
285 342 }
  343 + let newDataArr = newDataArray as! [CNLiveDownSlideModel]
  344 +
  345 + databaseManager.saveModel(newDataArr)
  346 + databaseManager.updateModel(newDataArr)
  347 +
286 348 self.dataArray.addObjects(from: newDataArray as! [Any])
287 349 if self.idModel?.id == 6{
288 350 //幼教中国,请求我的课程接口
... ... @@ -298,10 +360,13 @@ class CNUpSlideViewController: CNLiveBaseViewController,UITableViewDelegate,UITa
298 360 }
299 361  
300 362 }else if (status == .failed){
  363 +// print("222222222getPageFail:\(self.downPath!)")
301 364 // self.NetApiStatus = .apiError
302 365 }else if (status == .noNetwork){
303   -
  366 +// print("222222222getPageFail:\(self.downPath!)")
304 367 // self.NetApiStatus = .notNetwork
  368 + }else{
  369 +// print("222222222getPageFail:\(self.downPath!)")
305 370 }
306 371 }
307 372 //
... ...
metaCode/Classes/Main/HomePage/View/VerticalViews/DownSlide/CNDownSlideSingleCourseCell.swift
... ... @@ -105,7 +105,7 @@ class CNDownSlideSingleCourseCell: UITableViewCell {
105 105 //全部课程列表
106 106 contentView.addSubview(bgBackView)
107 107  
108   - bgBackView.frame = CGRect(x: DownSlideRecommendLeftGap, y: 0,width:DownSlideSingleCourseW , height:model.cellH-DownSlideRecommendLeftGap)
  108 + bgBackView.frame = CGRect(x: DownSlideRecommendLeftGap, y: 0,width:DownSlideSingleCourseW , height:CGFloat(model.cellH)-DownSlideRecommendLeftGap)
109 109 // 设置阴影效果
110 110 bgBackView.layer.masksToBounds = false
111 111 //定义view的阴影颜色
... ... @@ -120,7 +120,7 @@ class CNDownSlideSingleCourseCell: UITableViewCell {
120 120 bgBackView.backgroundColor = .white
121 121  
122 122 var titleTop:CGFloat = DownSlideRecommendLeftGap
123   - if model.blockSubTitle?.count ?? 0 > 0{
  123 + if model.blockSubTitle.count ?? 0 > 0{
124 124 let subtitleLbl = UILabel(frame: CGRect(x: DownSlideRecommendLeftGap, y: DownSlideRecommendLeftGap, width: DownSlideSingleCourseW-DownSlideRecommendLeftGap*2, height: 17))
125 125 subtitleLbl.text = model.blockSubTitle
126 126 subtitleLbl.font = Font_12
... ... @@ -202,8 +202,8 @@ class CNDownSlideSingleCourseCell: UITableViewCell {
202 202 bgImageView.layer.cornerRadius = GlobalConstants.toDayCardCornerRadius
203 203 bgImageView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
204 204 bgImageView.layer.masksToBounds = true
205   - if let bgImgStr = model.background{
206   - bgImageView.kf.setImage(with: URL(string: bgImgStr))
  205 + if model.background.count > 0{
  206 + bgImageView.kf.setImage(with: URL(string: model.background))
207 207 }else{
208 208 bgImageView.kf.setImage(with: URL(string: model.contents[0].poster ?? ""))
209 209 }
... ...
metaCode/Classes/Main/HomePage/View/VerticalViews/DownSlide/CNLiveDownSlideRecommendCell.swift
... ... @@ -57,7 +57,7 @@ class CNLiveDownSlideRecommendCell: UITableViewCell {
57 57 //显示左边的块
58 58 let contentMdl = model.contents[(hangIndex-1)*2+(lieIndex)]
59 59 let imageView = UIImageView(frame: CGRectMake(DownSlideRecommendLeftGap, CGFloat(hangIndex-1)*DownSlideRecommendWH+DownSlideRecommendLeftGap*CGFloat(hangIndex-1), CGFloat(DownSlideRecommendWH), CGFloat(DownSlideRecommendWH)))
60   - imageView.kf.setImage(with: URL(string:contentMdl.poster!))
  60 + imageView.kf.setImage(with: URL(string:contentMdl.poster))
61 61 imageView.tag = i
62 62 imageView.layer.cornerRadius = 14
63 63 imageView.clipsToBounds = true
... ... @@ -69,7 +69,7 @@ class CNLiveDownSlideRecommendCell: UITableViewCell {
69 69 //lieIndex==1显示右边的块
70 70 let contentMdl = model.contents[(hangIndex-1)*2+(lieIndex)]
71 71 let imageView = UIImageView(frame: CGRectMake(CGFloat(DownSlideRecommendLeftGap*2)+CGFloat(DownSlideRecommendWH), CGFloat(hangIndex-1)*DownSlideRecommendWH+DownSlideRecommendLeftGap*CGFloat(hangIndex-1), CGFloat(DownSlideRecommendWH), CGFloat(DownSlideRecommendWH)))
72   - imageView.kf.setImage(with: URL(string:contentMdl.poster!))
  72 + imageView.kf.setImage(with: URL(string:contentMdl.poster))
73 73 imageView.tag = i
74 74 imageView.layer.cornerRadius = 14
75 75 imageView.clipsToBounds = true
... ...
metaCode/Classes/Main/HomePage/View/VerticalViews/DownSlide/CNLiveDownslideOperationManager/CNLiveDownslideOperationManager.swift 0 → 100644
  1 +//
  2 +// CNLiveDownslideOperationManager.swift
  3 +// metaCode
  4 +//
  5 +// Created by zx on 2024/3/27.
  6 +// 下滑页原生页getpage网络请求 队列管理类
  7 +
  8 +import Foundation
  9 +
  10 +class CNLiveDownslideOperationManager : NSObject{
  11 +
  12 + //单例类
  13 + static let shared = CNLiveDownslideOperationManager()
  14 +
  15 + let operationQueue = OperationQueue()
  16 +
  17 + override init() {
  18 + super.init()
  19 + self.operationQueue.maxConcurrentOperationCount = 1
  20 + }
  21 +
  22 + func addDownslideOperation(operation:Operation){
  23 + if self.operationQueue.operationCount == 0{
  24 + self.operationQueue.addOperation(operation)
  25 + }else{
  26 + // 添加Operation到OperationQueue,并设置依赖关系
  27 + self.operationQueue.addOperation(operation)
  28 + if let lastOperation = operationQueue.operations.last {
  29 + operation.addDependency(lastOperation)
  30 + }
  31 + }
  32 + }
  33 +}
... ...
metaCode/Classes/Main/Model/CNLiveDownSlideModel.swift
... ... @@ -9,22 +9,32 @@ import Foundation
9 9  
10 10 // !!!: /contentApi/getPage 接口数据
11 11 class CNLiveDownSlideModel: BaseModel {
  12 + ///page id自定义数据方便数据库
  13 + var id: Int = 0
  14 + ///存入数据库时间戳10位
  15 + var timeStamp:Int = 0
  16 + ///是否可以请求GetPage接口,1可以 0不可以
  17 + var isGetPage:Int = 0
  18 +
  19 + ///////接口数据
12 20 ///大块标题id
13   - var blockId: String?
  21 + var blockId: String = ""
14 22 ///大块标题
15   - var blockName: String?
  23 + var blockName: String = ""
16 24 ///大块副标题
17   - var blockSubTitle: String?
  25 + var blockSubTitle: String = ""
18 26 ///类型 type=4一排两个 74今日推荐 12列表全部课程 75单课程大图
19   - var type: String?
  27 + var type: String = ""
20 28 ///区块封面图
21   - var background: String?
  29 + var background: String = ""
22 30 ///显示几行
23 31 var rowNum: Int = 0
24 32 ///具体内容 title subTitle poster thirdUrl或者shareUrl
25 33 var contents = [CNLiveDownSlideContentsModel]()
26 34 ///cell高度
27   - var cellH: CGFloat = 0
  35 + var cellH: Float = 0
  36 +
  37 +
28 38 }
29 39  
30 40 //下滑tableview背景颜色
... ... @@ -40,29 +50,29 @@ let kCNDownSlideContentsModelModelServing: String = &quot;serving&quot;//微信小程序
40 50  
41 51 class CNLiveDownSlideContentsModel: BaseModel {
42 52 ///内容id
43   - var contentId: String?
  53 + var contentId: String = ""
44 54 ///主标题
45   - var title: String?
  55 + var title: String = ""
46 56 ///副标题
47   - var subTitle: String?
  57 + var subTitle: String = ""
48 58 ///头像/
49   - var poster: String?
  59 + var poster: String = ""
50 60 ///videoId
51   - var pid: String?
  61 + var pid: String = ""
52 62 ///model
53 63 ///1,2时跳转:sharelUrl后面拼接 ?contentId=contentId&videoId=pid
54 64 ///3,4时跳转:thirdUrl
55 65 ///“album”,“album_video”,“album_ugc” -> http://wjjh5.cnlive.com/cnYmAlbumVideoList.html?aid=contentId&title=titlle
56 66 /// aid:专辑id,title:专辑名称(需要encode)
57   - var model: String?
  67 + var model: String = ""
58 68 ///model为1,2时
59   - var shareUrl: String?
  69 + var shareUrl: String = ""
60 70 ///model为3,4时跳转url
61   - var thirdUrl: String?
  71 + var thirdUrl: String = ""
62 72 ///小程序地址和小程序id {"path":"page/login_hint/login_hint","id":"gh_234d4ed615a3"}
63   - var s_to: String?
  73 + var s_to: String = ""
64 74 ///103时为微信小程序
65   - var s_type: String?
  75 + var s_type: String = ""
66 76 ///"weixin://dl/business/?t=NnvptiuER3k"
67   - var s_showType: String?
  77 + var s_showType: String = ""
68 78 }
... ...
metaCode/Classes/Main/Model/CNLiveDownSlideModelLayout.swift
... ... @@ -38,14 +38,14 @@ class CNLiveDownSlideModelLayout:NSObject{
38 38 if row == 0{//row为0 , contents全部显示
39 39 totalNum = contentsNum
40 40 }
41   - _slideModel?.cellH = ceil(CGFloat(totalNum)*0.5)*(DownSlideRecommendWH + DownSlideRecommendLeftGap)
  41 + _slideModel?.cellH = Float(ceil(CGFloat(totalNum)*0.5)*(DownSlideRecommendWH + DownSlideRecommendLeftGap))
42 42 }else if(_slideModel?.type == SlideModelTypeTodayRecommend74){//今日推荐
43 43 //总显示块数/循环数
44 44 var totalNum = (contentsNum >= row) ? row : contentsNum
45 45 if row == 0{//row为0 , contents全部显示
46 46 totalNum = contentsNum
47 47 }
48   - _slideModel?.cellH = CGFloat(totalNum)*(DownSlideTodayRecommendH + DownSlideRecommendLeftGap)
  48 + _slideModel?.cellH = Float(CGFloat(totalNum)*(DownSlideTodayRecommendH + DownSlideRecommendLeftGap))
49 49 }else if(_slideModel?.type == SlideModelTypeAllCourse12){//全部课程
50 50 //总显示块数/循环数
51 51 var totalNum = (contentsNum >= row) ? row : contentsNum
... ... @@ -53,11 +53,11 @@ class CNLiveDownSlideModelLayout:NSObject{
53 53 totalNum = contentsNum
54 54 }
55 55  
56   - _slideModel?.cellH = DownSlideAllCourseTitleH + DownSlideAllCourseRowH * CGFloat(totalNum)+DownSlideRecommendLeftGap
  56 + _slideModel?.cellH = Float(DownSlideAllCourseTitleH + DownSlideAllCourseRowH * CGFloat(totalNum)+DownSlideRecommendLeftGap)
57 57  
58 58 }else if(_slideModel?.type == SlideModelTypeOneCourse75){//单节课程
59 59  
60   - _slideModel?.cellH = DownSlideSingleCourseImgH + DownSlideSingleCourseMoreH+DownSlideRecommendLeftGap
  60 + _slideModel?.cellH = Float(DownSlideSingleCourseImgH + DownSlideSingleCourseMoreH+DownSlideRecommendLeftGap)
61 61 }else{
62 62 _slideModel?.cellH = 0
63 63 }
... ...
metaCode/Classes/Main/Util/CNLiveDownSlideTool.swift
... ... @@ -142,7 +142,7 @@ class CNLiveDownSlideTool:NSObject{
142 142  
143 143 let queryItem = URLQueryItem(name: "contentId", value: contentMdl.contentId)
144 144 let queryItem1 = URLQueryItem(name: "videoId", value: contentMdl.pid)
145   - let urlComponents = NSURLComponents(string: (contentMdl.shareUrl)!)!
  145 + let urlComponents = NSURLComponents(string: (contentMdl.shareUrl))!
146 146 urlComponents.queryItems = [queryItem, queryItem1]
147 147 let regURL = urlComponents.url
148 148 let webVC = CNWebViewController()
... ... @@ -151,7 +151,7 @@ class CNLiveDownSlideTool:NSObject{
151 151  
152 152 }else if (contentMdl.model == kCNDownSlideContentsModelModel3) || (contentMdl.model == kCNDownSlideContentsModelModel4){
153 153 let webVC = CNWebViewController()
154   - webVC.url = URL(string: (contentMdl.thirdUrl)!)
  154 + webVC.url = URL(string: (contentMdl.thirdUrl))
155 155 viewController.navigationController?.pushViewController(webVC, animated: true)
156 156 }else if (contentMdl.model == kCNDownSlideContentsModelModelAlbum){
157 157  
... ... @@ -179,7 +179,7 @@ class CNLiveDownSlideTool:NSObject{
179 179 viewController.navigationController?.pushViewController(webVC, animated: true)
180 180 }else if (contentMdl.model == kCNDownSlideContentsModelModelAlbum_ugc){
181 181 //短剧-跳转短剧播放页
182   - navigationViewController().visibleViewController?.navigationController?.pushViewController(CNLiveShortVideoViewController(aid: contentMdl.contentId!), animated: pushAnimated)
  182 + navigationViewController().visibleViewController?.navigationController?.pushViewController(CNLiveShortVideoViewController(aid: contentMdl.contentId), animated: pushAnimated)
183 183 }else if contentMdl.model == kCNDownSlideContentsModelModelServing{
184 184 //跳转微信小程序
185 185 if let data = (contentMdl.s_to ?? "").data(using: .utf8) {
... ...
metaCode/Classes/Other/AppDelegate.swift
... ... @@ -46,10 +46,19 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
46 46 window?.rootViewController = is_login ? CNLiveBaseTabBarViewController.init() : CNLiveLoginViewController.init()
47 47 window?.makeKeyAndVisible()
48 48  
49   -
50 49 AppDelegate_configRequestManager()
51 50 AppDelegate_configIQKeyboardManager()
52 51  
  52 + let databasePath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
  53 + let filePath = "\(databasePath)/CNLiveDownSlideModelDataBase.db"
  54 + let databaseManager = DatabaseManager(filePath: filePath)
  55 + databaseManager.createTable()
  56 +
  57 + if databaseManager.hasDataInTable(){
  58 + databaseManager.updateIsGetPage(isGetPage: 1)
  59 + }else{
  60 + print("noData")
  61 + }
53 62 return true
54 63 }
55 64  
... ...