如何在单例类中共享变量

赛义德·塔里克(Syed Tariq)

我正在尝试创建一个用于在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是异步方法(即,它立即返回,但是在查询完成后稍后会调用闭包)。所以,你不能返回loadCompleteloadRecordsFromParse,例如。几乎肯定不会在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在单例类中共享变量

来自分类Dev

使用单例类时在多处理中共享的状态

来自分类Dev

如何在ViewModel中共享ShowViewModel类

来自分类Dev

在React中共享单例通量存储

来自分类Dev

如何在整个项目中共享类的实例?

来自分类Dev

如何在Web会话中共享静态变量

来自分类Dev

如何在'joblib'Python库中共享变量

来自分类Dev

如何在并发JSF查询中共享变量?

来自分类Dev

Puppet:如何在模块中共享公共资源/变量

来自分类Dev

如何在Javascript中创建单例类?

来自分类Dev

如何在iOS中创建单例类?

来自分类Dev

如何在C ++中创建简单的单例类?

来自分类Dev

如何在单例类中调用同级函数?

来自分类Dev

如何在Android的单例类中制作进度栏

来自分类Dev

如何在python中以单例继承基类

来自分类Dev

如何在派生类中共享方法而不包含基类

来自分类Dev

如何在JPA中共享EntityManagerFactory

来自分类Dev

如何在C#中共享常量

来自分类Dev

如何在Flutter中共享PDF文件

来自分类Dev

如何在Android中共享图像?

来自分类Dev

如何在Word中共享引用?

来自分类Dev

如何在线程中共享内存

来自分类Dev

如何在 Excel 2010 中共享宏?

来自分类Dev

单例类和实例变量

来自分类Dev

单例类和实例变量

来自分类Dev

在C ++中,如何在同一类对象中共享公共元素。

来自分类Dev

如何在并行的Bitbucket管道步骤中共享环境变量?

来自分类Dev

如何在angular v4 ts中共享变量并跟踪它在多个组件中的变化

来自分类Dev

如何避免单例课程中不同用户之间的变量共享