辛格尔顿?或者,还有更好的方法?

时间:2017-03-16 08:26:48

标签: swift swift3

我即将建立一个单身人士,但我不确定它是否是正确的解决方案。

我有这个问题我有一个创建URLSessionTaskDelegate的类。我想在另一个类中使用该委托从文件上传中获取一些信息。

所以我在想如果我可以把这个以及其他一些信息放到像这样的对象中:

    public class UploadQueueCellData
    {
        let _FileName:String
        let _UploadTaskDelegate:URLSessionTaskDelegate
        let _ImageData:Data
        init(fileName:String,imageData:Data,uploadTaskDelegate:URLSessionTaskDelegate)
        {
            _FileName = fileName
            _ImageData = imageData
            _UploadTaskDelegate = uploadTaskDelegate
        }

.... etc
}

然后将其存储在一个包含数组的单例中:

        public class ImageUploadQueue
    {
        private var _queue = [UploadQueueCellData]()
        private let imageUploadQueue:ImageUploadQueue? = nil
        public func GetImageUploadQueueInstance() -> ImageUploadQueue
        {
            if imageUploadQueue == nil
            {
                imageUploadQueue = ImageUploadQueue()
                return imageUploadQueue
            }
            else
            {
                return imageUploadQueue!
            }
        }
        private init()
        {

        }
    .... etc
}

然后使用它来更新信息,因为更改发生在另一个类中。

但没有单身人士会有更好的方法吗?从Swift 3的角度来看,我甚至是在做单身人士吗?

修改

所以我发现我做错了单身人士:

    public class ImageUploadQueue
{
    private var _queue = [UploadQueueCellData]()
    //private let imageUploadQueue:ImageUploadQueue? = nil
    static let shared = ImageUploadQueue()

    private init()
    {

    }
那会更好吗?但问题仍然是没有比使用单例模式更好的方法吗?我说得更好只是因为我认为单身人士模式是最后的手段。

1 个答案:

答案 0 :(得分:0)

我发现我的问题源于这样一个事实:我无法在一个视图中创建一个类来在另一个视图中显示信息。我对此的解决方案是它上面的单例解决方案,但我觉得使用该解决方案很脏。

我终于找到了另一种方法来做到这一点。而不是单身人士,我刚刚创建了一个包含数组的类,就像上面的单例一样:

public class ImageUploadQueue
{
   private var _queue = [UploadQueueCellData]()
   ....//Class specific code
}

然后只使用该类作为对数据的引用,就像单例一样,除了我的上面的类 有这个功能,使视图能够使用队列中的信息

public func GetUploadQueue()->ImageUploadQueue
{
       return _networkRequester.uploadQueue
}

然而,该类是由viewA创建的,我需要ViewB中的信息。 所以我在viewB

中这样做了
var uploader:ImageUpload
{
     get
     {
         return ((self.tabBarController!.viewControllers![0] as? UINavigationController)?.viewControllers[0] as! ViewController).uploader
     }
     set
     {
           (self.tabBarController!.viewControllers![0] as! ViewController).uploader = newValue
     }
}

它解决了我最初的问题,因为无法从viewA获取信息到ViewB同时避免使用单例。