Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 重现单身_Ios_Swift_Singleton - Fatal编程技术网

Ios 重现单身

Ios 重现单身,ios,swift,singleton,Ios,Swift,Singleton,我已经到了不幸的地步,我需要重新创造一个单身汉 看起来像这样 class Myplayer: AVPlayer { static let sharedInstance: Myplayer = { let instance = Myplayer() return instance }() 从中可以看出,这是因为AVPlayer有时会进入失败状态(.status=.failed),文档中特别提到,为了进一步工作,需要重新创建实例本身 我已经用这个

我已经到了不幸的地步,我需要重新创造一个单身汉

看起来像这样

class Myplayer: AVPlayer {
    static let sharedInstance: Myplayer = {

        let instance = Myplayer()

        return instance
    }()
从中可以看出,这是因为AVPlayer有时会进入失败状态(.status=.failed),文档中特别提到,为了进一步工作,需要重新创建实例本身

我已经用这个单例模式结束了我的应用程序,并且有几个月的时间使用它,所以现在将其更改为非单例模式可能需要太多的工作


因此,我的问题是,如何以一种漂亮的方式重新创建这个单例?

您可以将一个公共/内部
sharedInstance
作为一个计算属性,它从一个私有
\u sharedInstance
共享对象。这样,就不能从类外部分配新实例。还添加一个静态函数,通过为私有
\u sharedInstance
分配一个新的
Myplayer
对象来重新创建实例

class Myplayer: AVPlayer {
    private static var _sharedInstance = Myplayer()
    static var sharedInstance: Myplayer {
        return Myplayer._sharedInstance
    }
    static func recreateInstance() {
        Myplayer._sharedInstance = Myplayer()
    }
}

您可以将public/internal
sharedInstance
作为计算属性,该属性共享私有
\u sharedInstance
中的对象。这样,就不能从类外部分配新实例。还添加一个静态函数,通过为私有
\u sharedInstance
分配一个新的
Myplayer
对象来重新创建实例

class Myplayer: AVPlayer {
    private static var _sharedInstance = Myplayer()
    static var sharedInstance: Myplayer {
        return Myplayer._sharedInstance
    }
    static func recreateInstance() {
        Myplayer._sharedInstance = Myplayer()
    }
}

每当我需要(例如)单元测试期间可重置的单例时,我都会使用此模式:

class MyManager {

    private static var _sharedInstance: MyManager? = nil

    static var sharedInstance: MyManager {
        if _sharedInstance == nil {
            _sharedInstance = MyManager()
        }
        return _sharedInstance!
    }

    static func resetSharedInstance() {
        _sharedInstance = nil
    }
}

每当我需要(例如)单元测试期间可重置的单例时,我都会使用此模式:

class MyManager {

    private static var _sharedInstance: MyManager? = nil

    static var sharedInstance: MyManager {
        if _sharedInstance == nil {
            _sharedInstance = MyManager()
        }
        return _sharedInstance!
    }

    static func resetSharedInstance() {
        _sharedInstance = nil
    }
}

你在正确的轨道上。关键是创建一个计算属性,检查
AVPlayer
状态是否为
.failed
,如果是,则重新创建实例。第二个
私有静态let
包含对singleton的引用,并在检查后返回:

import AVKit

class MyPlayer {
  private static var avPlayer = AVPlayer()

  private static let _sharedInstance = MyPlayer()

  public static var sharedInstance: MyPlayer {
    if self.avPlayer.status == .failed {
      self.avPlayer = AVPlayer()
    }

    return self._sharedInstance
  }

  private init () {}
}

无需重新创建singleton。

您走对了方向。关键是创建一个计算属性,检查
AVPlayer
状态是否为
.failed
,如果是,则重新创建实例。第二个
私有静态let
包含对singleton的引用,并在检查后返回:

import AVKit

class MyPlayer {
  private static var avPlayer = AVPlayer()

  private static let _sharedInstance = MyPlayer()

  public static var sharedInstance: MyPlayer {
    if self.avPlayer.status == .failed {
      self.avPlayer = AVPlayer()
    }

    return self._sharedInstance
  }

  private init () {}
}

没有必要重新创建singleton。

这种看起来不错,但我想知道,如果你这样做,这是否仍然是singleton模式……如果你认为这不符合singleton模式,那是因为你的用例。这种看起来不错,但我想知道,如果你这样做,这仍然是单例模式吗?如果您认为这不符合单例模式,那么这是因为您的用例。不要重新创建单例。如果你重新创建一个实例,它永远不会是单例的。而是在singleton类中编写一个方法,将其重置为干净状态。这也是您在重新创建实例时得到的结果。只需清除所有属性并回退到它们的初始值:)您已重置实例而不是重新创建实例:除非您有其他信息,否则无法使用AVPlayer。不要重新创建singleton。如果你重新创建一个实例,它永远不会是单例的。而是在singleton类中编写一个方法,将其重置为干净状态。这也是您在重新创建实例时得到的结果。只需清除所有属性并回退到它们的初始值:)您已重置实例而不是重新创建实例:除非您有其他信息,否则AVPlayer不可能使用。好主意,但是让
avPlayer
成为singleton上的属性不是更好吗?不可能从
static
成员访问非
static
实例变量;所以
avPlayer
必须是
static
。很好地解释了这一点。有几个有用的答案,这就是我现在使用的答案。但是,我确实使用了
avPlayer
作为MyPlayer实例的成员变量/属性(它工作得很好,只需从
avPlayer
中删除
static
)。在这种情况下,这可能没有什么不同,但是。关键是让MyPlayer成为一个单例,然后在失败时能够重新创建相关的AVPlayer。为了便于大家记笔记,并且让事情更清楚,我将MyPlayer重命名为其他名称,因为它不再是真正的玩家,这应该可以避免混淆。Xcode 9现在对Swift提供了极好的重构/重命名支持。这主意不错,但是让
avPlayer
成为singleton上的一个属性不是更好吗?不可能从
static
成员访问非
static
实例变量;所以
avPlayer
必须是
static
。很好地解释了这一点。有几个有用的答案,这就是我现在使用的答案。但是,我确实使用了
avPlayer
作为MyPlayer实例的成员变量/属性(它工作得很好,只需从
avPlayer
中删除
static
)。在这种情况下,这可能没有什么不同,但是。关键是让MyPlayer成为一个单例,然后在失败时能够重新创建相关的AVPlayer。为了便于大家记笔记,并且让事情更清楚,我将MyPlayer重命名为其他名称,因为它不再是真正的玩家,这应该可以避免混淆。如今,Xcode 9对Swift提供了极好的重构/重命名支持。