2016-08-18 66 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世界=) –