2016-08-18 34 views
1

使用单我有一个单例类:骑自行车在斯威夫特

class SomeManager { 
    static let sharedInstance = SomeManager() 

    let serverService = SomerServerService() 
    let musicService = SomeMusicService() 
} 

我尝试使用

class SomeMusicService 
{ 
    let serverService = SomeManager.sharedInstance.serverService //here seems I get cycle. 
} 

我应该用偷懒或其他一些初始化。

正如你可以看到let musicService = SomeMusicService()初始化一个对象,然后在同一个对象SomeMusicService它试图调用SomeManager单身的sharedInstance在开始获得其他服务。

所以这是一个完整的清单:

import Foundation 

class ServerService 
{ 
    func downloadMusic() 
    { 
    print("Download music and play it after that.") 
    } 
} 

class MusicService 
{ 
    let serverService = Singleton.shared.serverService 

    func playMusic() 
    { 
    serverService.downloadMusic() 
    } 
} 

class Singleton 
{ 
    static let shared = Singleton() 

    let serverService = ServerService() 
    let musicService = MusicService() 
} 


let s = Singleton.shared 
print("Hello, World!") 

我们永远也不会被调用print("Hello, World!")线。

回答

3

你可以使用weak避免保留周期,但更好的答案是计算性能:

class SomeMusicService { 
    var serverService: SomeService { return SomeManager.sharedInstance.serverService } 
} 

我看到你的更新代码周期是什么。下面是它如何发挥出来:

  • 呼叫Singleton.shared
    • 开工建设辛格尔顿
      • 构建Server服务(用于Server服务属性)
      • 开工建设MusicService(用于musicService属性)
        • 调用Singleton.shared(用于serverService属性)
        • 块等待Singleton.shared完成

该计划目前陷入僵局等待本身。

正确的答案是使用计算属性,以便在施工过程中不需要调用Singleton.shared。一个lazy属性也会起作用,但是对于这个问题似乎有很多麻烦(并且可能会在服务之间创建保留循环)。

+0

酷得到它,似乎在我的情况下单身还没有被初始化,但我尝试在同一时间使用它。我认为只有懒惰的选择,但似乎你是正确的计算属性也没关系。 –

+0

我的意思是懒惰是SomeManager单身已经创建的保证,我们可以使用一些属性。还有一个问题,你认为这是保留周期问题?也许我以错误的方式提问。似乎我开始在另一个服务中使用同一个服务,但我在一个单例中初始化所有服务。 –

+0

我更新了一个列表的问题。无法理解我们从哪里开始骑车,因为我是从Objective-C世界=) –