ios - 如何在 swift 中使用 mvvm 合并两个数据源模型

标签 ios swift merge tableview alamofire

我有两个数据源模型。我在 mvvm 中进行。

我的数据源模型如下。

class QuestionDataSourceModel: NSObject {

    var dataListArray:Array<QuestionListModel>? = []

    var list:Array<OptionsModel>? = []


    init(array :Array<[String:Any]>?) {
        super.init()



        var newArray:Array<[String:Any]> = []
        if array == nil{

            // newArray = self.getJsonDataStored22()
        }
        else{
            newArray = array!

        }

        var datalist:Array<QuestionListModel> = []
        for dict in newArray{

            let model = QuestionListModel(dictionary: dict)

            datalist.append(model)
        }
        self.dataListArray = datalist
        print(self.dataListArray)
    }

}

以上是第一个数据源模型。

下一个数据源模型如下。

class DummyDataSourceModel: NSObject {
    var dataListArray:Array<DummyDataModel>? = []

    var list:Array<DummyDataModel>? = []


    init(array :Array<[String:Any]>?) {
        super.init()



        var newArray:Array<[String:Any]> = []
        if array == nil{

            // newArray = self.getJsonDataStored22()
        }
        else{
            newArray = array!

        }

        var datalist:Array<DummyDataModel> = []
        for dict in newArray{

            let model = DummyDataModel(dictionary: dict)

            datalist.append(model)
        }
        self.dataListArray = datalist
        print(self.dataListArray)
    }

}

在我的 View Controller 中:-

 questionViewModel.loadData { (isSuccess) in


            if(isSuccess == true)
            {
                let sec = self.questionViewModel.numberOfSections()
                for _ in 0..<sec
                {


                    self.questionViewModel.answers1.add("")
                    self.questionViewModel.questions1.add("")
                    self.questionViewModel.questionlist1.add("")


                }
            //questionViewModel.numberOfSections()


                  self.activityindicator.stopAnimating()
                  self.activityindicator.isHidden = true
                   self.tableview.refreshControl = refreshControl
               self.tableview .allowsMultipleSelection = false

                self.tableview.reloadData()


              //  self.questionViewModel.loadData2{ (isSuccess) in

                   self.dummyDataViewModel.loadData1{ (isSuccess) in


                    if(isSuccess == true)
                    {

                        print(self.questionViewModel.datasourceModel.dataListArray?.count)
                        self.questionViewModel.totaldata()
                        self.tableview2.allowsMultipleSelection = false
                        self.tableview2.reloadData()


                    }
                    else{

                     self.viewDidLoad()

                    }


                }



            }
            else{


                self.activityindicator.stopAnimating()

                self.activityindicator.isHidden = true


                let controller = UIAlertController(title: "No Internet Detected", message: "This app requires an Internet connection", preferredStyle: .alert)
                // Create the actions
                let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default) {
                    UIAlertAction in
                    NSLog("OK Pressed")


                    self.viewDidLoad()


                }
                controller.addAction(okAction)


                self.present(controller, animated: true, completion: nil)

                        }
        }

我的问题 View 模型:-

 func loadFromWebserviceData(completion :@escaping (QuestionDataSourceModel?) -> ()){


        Alamofire.request("http://www.example.com").validate(statusCode: 200..<300).validate(contentType: ["application/json"]).responseJSON{ response in

            let status = response.response?.statusCode
            print("STATUS \(status)")

            print(response)

            switch response.result{

            case .success(let data):
                print("success",data)

                let result = response.result

                print(result)

                if  let wholedata = result.value as? [String:Any]{

                    print(wholedata)


                    if  let data = wholedata["data"] as? Array<[String:Any]>{

                        print(data)
                        print(response)

                        for question in data {

                            let typebutton = question["button_type"] as? String
                            print(typebutton)
                            self.type = typebutton

                            let options = question["options"] as! [String]

                         //   self.dataListArray1 = [options]
                            self.tableArray.append(options)
                           // self.savedataforoptions(completion: <#T##(NH_OptionslistDataSourceModel?) -> ()#>)

                            self.no = options.count
                        }

                        print(self.tableArray)


                        let newDataSource:QuestionDataSourceModel = QuestionDataSourceModel(array: data)

                        completion(newDataSource)

                    }

                }


            case .failure(let encodingError ):
                print(encodingError)

                //  if response.response?.statusCode == 404{

                print(encodingError.localizedDescription)

                completion(nil)

            }

        }}

  func loadData(completion :@escaping (_ isSucess:Bool) -> ()){


        loadFromWebserviceData { (newDataSourceModel) in

            if(newDataSourceModel != nil)
            {

                self.datasourceModel = newDataSourceModel!
                completion(true)

            }
            else{
                completion(false)
            }
        }
    }

我的 dummyViewModel 如下:-

 func loadFromDummyData(completion :@escaping (DummyDataSourceModel?) -> ()){


        if let path = Bundle.main.path(forResource: "jsonData", ofType: "json") {
            do {
                let jsonData = try NSData(contentsOfFile: path, options: NSData.ReadingOptions.mappedIfSafe)

                do {
                    let jsonResult: NSDictionary = try JSONSerialization.jsonObject(with: jsonData as Data, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary


                    if let people  = jsonResult["data"] as? Array<[String:Any]> {
                        //  self.dict = people



                        for person in people {

                            let options = person["options"] as! [String]


                            self.tableArray.append(options)



                            let name = person ["question"] as! String

                                                      self.tableArray.append(options)
                        }
                        let newDataSource:DummyDataSourceModel = DummyDataSourceModel(array: people)

                        completion(newDataSource)


                    }



                } catch {}
            } catch {}
        }

    }

    func loadData1(completion :@escaping (_ isSucess:Bool) -> ()){


        loadFromDummyData{ (newDataSourceModel) in

            if(newDataSourceModel != nil)
            {

                self.datasourceModel = newDataSourceModel!
                completion(true)

            }
            else{
                completion(false)
            }
        }
    }

现在我需要合并这两个数据源模型。

我正在使用tableview来显示数据。

所以首先我需要显示来自 JSON 的数据。然后下面我需要显示来自 json.file 的数据。那么如何合并这两个数据源模型。

首先,来自 JSON 的数据有 10 个部分。 在json.file中它有3个部分。总共13个部分。所以我需要在表格 View 中一起显示13个部分。怎么做?

这是 json.file 数据:-

{
    "data":[
              {
              "question": "Gender",
              "options": ["Male","Female"],
            "button_type":"2"

              },
              {
              "question": "How old are you",
              "options": ["Under 18","Age 18 to 24","Age 25 to 40","Age 41 to 60","Above 60"],
              "button_type":"2"
             },

             {
                "button_type":"2",
               "question": "I am filling the Questionnaire for?",
               "options": ["Myself","Mychild","Partner","Others"]

              }
              ]


}

与 api 中的 JSON 格式相同。

{
        "data":[
                  {
                  "question": "Gender",
                  "options": ["Male","Female"],
                "button_type":"2"

                  },
                  {
                  "question": "How old are you",
                  "options": ["Under 18","Age 18 to 24","Age 25 to 40","Age 41 to 60","Above 60"],
                  "button_type":"2"
                 },

                 {
                    "button_type":"2",
                   "question": "I am filling the Questionnaire for?",
                   "options": ["Myself","Mychild","Partner","Others"]

                  }
                  ]


    }

最佳答案

class OptionsModel: NSObject {
    var options: [String]?
    var question: String?
    var button_type: String?
}


class OptionsViewModel: NSObject {
    var optionList: Array<OptionsModel>?

    func callApi() { 
         yourApiCall() { webResponseArray in
              for res in webResponseArray {
                  let model = OptionsModel(json: res)
                  if optionList == nil {
                      optionList = [OptionsModel]()//Initialize Array if not initialized
                  }
                  optionList.append(model)// You are appending Option getting from web Api Response
              }
              //After Completely fetching all models from webResponseArray you should load Data from Local JSON
              loadLocalJSON()//After loading Data from Web You are loading Data from local JSON.
         }
    }
    func loadLocalJSON() {
         let localJsonArray = someMethodToLoadJsonFromLocalFileAndReturnsJSON()
         for json in localJsonArray {
              let model = OptionsModel(json: json)
              if optionList == nil {
                  optionList = [OptionsModel]()//Initialize Array if not initialized
              }
              optionList.append(model)// You are appending Option getting from Local JSON
         }
         //Now you have a single Array containing all local and remote option models.
    }
}

关于ios - 如何在 swift 中使用 mvvm 合并两个数据源模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52847595/

相关文章:

ios - 为什么当我进入设备锁定屏幕并重新进入应用程序时,我的通知声音警报不会消失?

git - 使用 git fast-export 从给定的提交开始导出存储库

iOS Enterprise Build - 不能使用通配符

ios - Page Controller 和 WebView 繁琐的刷新

swift - 从 iOS 创建分支链接,显示与仪表板链接相同的值

ios - 在 Swift 中将 Unicode(例如 1f564)转换为表情符号

ios - 旋转改变 UIImageView 框架。如何避免这种情况?

ios - 如何使用类方法添加手势识别器作为选择器?

python - Pandas 合并、缩放和旋转长格式和宽格式数据帧

excel - 将多个 csv 文件合并到一张 Excel 工作表中