专门为 VC 函数创建 swift 文件

Creating a swift File specially for VC Functions

我目前的VC有多行代码。它有多种功能,我想放在一个单独的文件中。每个函数都使用解析数据获取...

我的 VC 目前有这个示例函数,它在 ViewDidLoad 中使用各种数组调用。如您所见,我的 VC:

调用了各种数组和字符串
   // My View Controller //
    func getData() {
    let query = PFQuery(className: "Bar")
    query.order(byAscending: "Priority")
    query.whereKey("College", equalTo: college)
    query.findObjectsInBackground(block: { (objects: [PFObject]?, error: Error?) in
    if let objects = objects {
        for object in objects {
                if error == nil {
                    if object["Bar"] != nil && object ["Deal"] != nil && object["DealType"] != nil && object["Rank"] != nil && object["BarImage"] != nil {
                self.ArraySelected.append(object["Bar"] as! String)
                self.dealArray.append(object["Deal"] as! String)
                self.dealTypeArray.append(object["DealType"] as! String)
                self.barRankArray.append(object["Rank"] as! String)
                let barImageFile = object["BarImage"] as? PFFileObject
                let barUrlString = barImageFile?.url as! String
                            if let url = URL(string: barUrlString) {
                                let data = try? Data(contentsOf: url)
                                if let imageData = data {
                                    self.barUrlArray.append(barUrlString as NSString)
                                    self.barImageCache.setObject(UIImage(data:imageData)!, forKey: barUrlString as NSString)
                                    self.barImageDataArray.append(imageData)
                                }
                            }
                    }
                }
            }
        print(self.ArraySelected)
        self.barDisplayedTableView.reloadData()
        }
    })
}

我的步骤是创建一个 class 来容纳所有这样的函数。我还创建了我的 VC 的实例。我还制作了 NSObject 类型的 class。我不确定这是正确的:

  import UIKit
  import Parse
  //Not sure about this
  class ListofBarsVCActions: NSObject {
  //Not sure about this
  let sharedInstance = ListofBarsViewController()

  func getData() {

let query = PFQuery(className: "Bar")
query.order(byAscending: "Priority")
query.whereKey("College", equalTo: sharedInstance.college)
query.findObjectsInBackground(block: { (objects: [PFObject]?, error: Error?) in
if let objects = objects {
    for object in objects {
            if error == nil {
                if object["Bar"] != nil && object ["Deal"] != nil && object["DealType"] != nil && object["Rank"] != nil && object["BarImage"] != nil {
                    self.sharedInstance.ArraySelected.append(object["Bar"] as! String)
                    self.sharedInstance.dealArray.append(object["Deal"] as! String)
                    self.sharedInstance.dealTypeArray.append(object["DealType"] as! String)
                    self.sharedInstance.barRankArray.append(object["Rank"] as! String)
            let barImageFile = object["BarImage"] as? PFFileObject
            let barUrlString = barImageFile?.url as! String
                        if let url = URL(string: barUrlString) {
                            let data = try? Data(contentsOf: url)
                            if let imageData = data {
                                self.sharedInstance.barUrlArray.append(barUrlString as NSString)
                                self.sharedInstance.barImageCache.setObject(UIImage(data:imageData)!, forKey: barUrlString as NSString)
                                self.sharedInstance.barImageDataArray.append(imageData)
                            }
                        }
                }
            }
        }

    self.sharedInstance.barDisplayedTableView.reloadData()
        }
    })
}


override init() {
      // do initial setup or establish an initial connection
  }

}

从那里我回到我的 VC 并首先创建一个我刚刚创建的 class 的实例。然后我在 viewdidload 中调用 getData() 函数。

            //My VC//
            let ListofBarsVCInstance = ListofBarsVCActions()
            //ViewDidLoad://
            self.ListofBarsVCInstance.getData()

从那里我崩溃了。访问错误。我知道我的代码有问题,但我不知道确切的地方。我是一名新程序员,这对我来说是一个很大的转变。

如果您只是为了方便将一些函数移动到另一个文件中,那么您需要一个扩展,而不是一个额外的对象。摆脱 sharedInstance 而是:

extension ListofBarsViewController {

    ... Functions you want in this file ...

}

也就是说,想要这样做表明视图控制器做了太多工作,您应该将更多这种逻辑移到您的模型中 类 并使视图控制器更简单。

这是 MVC 的基本实现。您有一个可以调用模型和视图的控制器。现在,您可以将服务调用移至模型对象。

self.view.addSubview(UILabel())
self.model.printSomething()

class EventsViewController: UIViewController {

    var model: EventsViewModel?

    override func viewDidLoad() {
        super.viewDidLoad()
        model = EventsViewModel(self)
        model?.printSomething()
    }

}

class EventsViewModel: NSObject {
    weak private var controller: EventsViewController?

    init(_ controller: EventsViewController) {
        self.controller = controller
    }

    func printSomething() {
        print("printSomething")
    }
}