我正在尝试创建一个用于在Parse中存储和检索数据的通用类。我使ParseProcessing类成为单例类。从主View Controller加载数据,并将其存储到ParseProcessing中的字典中。我通过创建ParseProcessing类的共享实例来做到这一点。从另一个视图控制器,我尝试访问字典中的数据。我假设因为ParseProcessing是一个单例类,所以我只有一个字典副本。这似乎是不正确的。我应该如何在ParseProcessing中声明变量,以便共享它们?代码如下所示:
import UIKit
var gSep = ","
class QwikFileViewController: UIViewController {
var loadData = ParseProcessing.sharedInstance
override func viewDidLoad() {
super.viewDidLoad()
// load data from Parse
loadData.loadCategorySubcategoryData()
loadData.loadRecordsFromParse()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
ParseProcessing单例类
import UIKit
import Parse
class ParseProcessing: Parse {
var dictMenuList = [String:String]()
var noteTitle = [String]()
var notes = [String]()
var thumbnailFiles = [PFFile]()
var objectIds = [String]()
var noteImage = UIImage()
class var sharedInstance:ParseProcessing {
struct singleton {
static let instance:ParseProcessing = ParseProcessing()
}
return singleton.instance
}
// Load Category/Subcategory data from Parse Data Base
func loadRecordsFromParse () -> Bool{
var tmpFile = [PFFile]()
var loadComplete = false
var query = PFQuery(className:"Record")
query.findObjectsInBackgroundWithBlock {
(objects, error) -> Void in
if error == nil {
// The find succeeded.
println("Successfully retrieved \(objects!.count) items.")
for object in objects! {
self.noteTitle.append(object["title"] as! String)
self.notes.append(object["notes"] as! String)
self.thumbnailFiles.append(object["thumbnail"] as! PFFile)
self.objectIds.append(String(stringInterpolationSegment: object.objectId))
}
} else {
println("\(error)")
}
loadComplete = true
}
return loadComplete
}
// Load Category/Subcategory data from Parse Data Base
func loadCategorySubcategoryData () // -> Dictionary <String,String>
{
var success : Bool = false
var d : Dictionary <String,String> = ["":""]
var menu = PFQuery(className: "Classification")
println("ParseProcessing: loadCategory...")
menu.findObjectsInBackgroundWithBlock {
(objects, error) -> Void in
if error == nil {
var category = ""
var subcategory = ""
for object in objects! {
category = object["category"] as! String
println("ParseProcessing: category = \(category)")
subcategory = object["subcategory"] as! String
println("ParseProcessing: subcategory = \(subcategory)")
d[category] = subcategory
}
success = true
self.dictMenuList = d
return
} else {
println("ParseProcessing: error = \(error)")
success = false
}
}
return
}
}
另一个View Controller检查数据
import UIKit
class TestViewController: UIViewController {
var dictMenuList = [String:String]()
var loadData = ParseProcessing.sharedInstance
override func viewDidLoad() {
super.viewDidLoad()
dictMenuList = loadData.dictMenuList
println("dictMenuList: \(dictMenuList)")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
问题在于这findObjectsInBackgroundWithBlock
是异步方法(即,它立即返回,但是在查询完成后稍后会调用闭包)。所以,你不能返回loadComplete
的loadRecordsFromParse
,例如。几乎肯定不会在loadRecordsFromParse
返回时间之前完成此后台请求。
相反,您可能想要采用该completionHandler
模式。例如,此示例loadRecords
不尝试立即返回任何内容,而是completionHandler
在请求完成后调用。
func loadRecords(completionHandler:([SomeObject]?, NSError?) -> ()) {
let query = PFQuery(className: "SomeClass")
query.findObjectsInBackgroundWithBlock { objects, error in
// build some model object
completionHandler(objectArray, error)
}
}
您可以这样称呼它:
loadData.loadRecords() { objects, error in
// use `objects` (and make sure `error` is `nil`) here
}
// but do not use those variables here, as the above closure probably has not run yet!
坦白说,我倾向于将这些属性完全排除在您的单例中。当您处理异步代码时,拥有异步更新的公共属性将使您心痛。您可以做到,但这不是我的首选。
例如,当TestViewController
出现时,您不能假定与之关联的异步提取dictMenuList
尚未完成。我看了一下,想知道是否有TestViewController
必要初始化获取本身,然后dictMenuList
在完成处理程序中使用它。那将是最简单的。
如果您必须从一个视图控制器发起异步请求,然后在异步请求完成时通知另一个视图控制器,那么您可能必须使用其他一些模式,例如通知(例如use)NSNotificationCenter
,并在出现以下情况时进行单例发布通知完成各种请求,然后需要将此事实通知的任何视图控制器都可以将自己添加为该通知的观察者)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句