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提供了极好的重构/重命名支持。