2016-05-13 42 views
0

我是Swift中的新手。我試圖解析一些來自Web服務的JSON數據,並想要一個singleton類的用戶。但我堅持創建單例。這裏是我的代碼:Swift 2.2 singleton

import Foundation 
class User { 
    private var success: String 
    private var userId: String 
    private var name: String 
    private var gender: String 
    private var email: String 
    private var userObject = [User]() 

    class var sharedInstane:User { 
     struct Singleton { 
      static var onceToken: dispatch_once_t = 0 
      static var instance:User? = nil 
     } 
     dispatch_once(&Singleton.onceToken){ 
      Singleton.instance = User() 
     } 
     return Singleton.instance! 
    } 

    private init(success: String, userId: String, name: String, gender: String, email: String) 
    { 
     self.success = success 
     self.userId = userId 
     self.name = name 
     self.gender = gender 
     self.email = email 
    } 
    convenience init(dictionary: [String:AnyObject]) { 
    let success = dictionary["success"] as? String 
    let userId = dictionary["userId"] as? String 
    let name = dictionary["name"] as? String 
    let gender = dictionary["gender"] as? String 
    let email = dictionary["email"] as? String 
    self.init(success: success!, userId: userId!, name: name!, gender: gender!, email: email!,) 
    } 

    func callWebserviceToLoadUserInfo (url:String, param:[String:AnyObject],completeHandler:(Bool?,String) ->()) 

    { 
    let connection = ServerConnection() 
    connection.getJSONDataForWebService(url, params: param) { (response, error) in 
    // code goes here 
      var responseDict = response as! [String : AnyObject] 
      responseDict = responseDict["responseDict"] as! [String : AnyObject] 
       if responseDict["success"] as! String == "1" { 
        for dict in responseDict { 
        let user = User(dictionary: (dict as! [String:AnyObject])) 
         self.userObject.append(user) 
       } 
      print("user : \(self.userObject[0].name)") 
      }else{ 
       // error goes here 
      } 
     } 
    } 

}

任何一個可以請幫助我,我應該怎麼辦這個代碼?

+0

考慮製作這兩個類。創建一個處理所有數據的User模型類,就像你已經做的一樣,但沒有單例,然後創建一個'UserManager'或者一個單例,並且能夠返回一個用戶。 – Pascal

+0

你能舉個小例子嗎? – Rupshikha

+0

@Pascal爲什麼在使用兩個類時可以使用兩個類? – catalandres

回答

3

單行示例代碼中的單例。

class TheOneAndOnlyKraken { 
    static let sharedInstance = TheOneAndOnlyKraken() 
    private init() {} //This prevents others from using the default '()' initializer for this class. 
} 

For more details.

+0

謝謝你的回答。可以通過init()發送參數嗎? – Rupshikha

+1

如有必要,您可以初始化init內部的任何屬性。或者你可以有一個傳遞一些屬性的初始化方法。這裏是這樣的:只有當你調用'sharedInstance'時,纔會創建singleton,這被稱爲屬性,而不是方法。無論您添加到初始化程序的任何參數都將被硬編碼。 – catalandres

+1

@catalandres建議正確的方式跟着他 –

1

雖然User沒有實例化至少一次sharedInstance將返回nil。在User第一個成功實例化之後,sharedInstance開始返回它,並且隨着單例模式需要它,無法實例化另一個User。試想一下:

class User { 

    private static var sharedUser: User? 

    class var sharedInstance: User? { 

     return sharedUser 
    } 

    private init(success: String, userId: String, name: String, gender: String, email: String) 
    { 
     //User initialization code here 
     User.sharedUser = self 
    } 

    convenience init?(dictionary: [String:AnyObject]) { 

     guard User.sharedUser == nil else { 
      return nil 
     } 

     //dictionary parsing code is here 
     self.init(success: success!, userId: userId!, name: name!, gender: gender!, email: email!) 
    } 
} 

客戶端的代碼:

User.sharedUser 
//return nil 

let dict: [String:AnyObject] = ["success": "success", "userId":"userId", "name":"name", "gender":"gender","email":"email"] 
User(dictionary: dict) 
//creates User 

User.sharedUser 
//returns just created user 

User(dictionary: dict) 
//return nil 
+1

這是不必要的複雜。 – catalandres

+0

@catalandres它變得更簡單嗎? –

+0

閱讀[Maheshwar發佈的文章](http://krakendev.io/blog/the-right-way-to-write-a-singleton),檢查我的解決方案,然後我們談談。 – catalandres

2

使用Krakendev's單行單碼,通過馬赫斯赫瓦爾引用,並把你的convenience init到的實例函數與User.sharedInstance.initialize(dictionary)被稱爲:

import Foundation 
class User { 

    // Here you declare all your properties 
    // "private var" and all that jazz 

    static let sharedInstance = User() 

    private init() { 
     // If you have something to do at the initialization stage 
     // you can add it here, as long as it does not involve 
     // arbitrary values that you would pass as parameters. 
    } 

    func initialize(dictionary: [String:AnyObject]) { 
     // Transfer the values of the dictionary to each `self.property`. 
     // Be careful while using `as?` as you may have to deal with  
     // optionals. No need to call `self.init` at the end, because 
     // this is now a regular `func`. 
    } 

    // Add the rest of your stuff here 

} 

關於你如何在該便利店內工作的一個說明e初始值設定程序:如果您執行property = SomeClass.someMethod().someProperty as? SomeType,則property將爲SomeType?Optional(SomeType)。根據The Swift Programming Language

條件表格as?返回您試圖向下轉換的類型的可選值。

0

您應該考慮製作這兩個類,以便User是您的模型類,然後創建一個管理器來處理所有用戶(這似乎是您的目標)。

所以在User刪除sharedInstane部分,並創建第二個單例類,例如,稱爲UserManager,用Swift創建單例的標準方法。然後,您可以保持創建用戶的方式,並最終將其分配給單例:

class UserManager { 
    static let sharedInstance = UserManager() 

    var users = [User]() 
} 

// in your code: 
... 
for dict in responseDict { 
    let user = User(dictionary: (dict as! [String:AnyObject])) 
    UserManager.sharedInstance.users.append(user) 
} 
... 
+0

Thnkx很多.... – Rupshikha