在一个swift 2应用程序中的几个单身人士

时间:2016-05-25 06:28:13

标签: swift singleton

我在我的应用程序中编写了一个需要作为数据类执行的2个类。一个用于用户详细信息,一个用于产品。 这两个类都是具有不同名称和变量的相同代码。 产品类工作正常但用户类不能为我创建sharedInstance。 Json得到的数据还可以打印出来。

这是我的代码:

import UIKit
import Alamofire
import SwiftyJSON

class userDetailsDataClass {
    let defaults = NSUserDefaults.standardUserDefaults()
    var user: [SwiftyJSON.JSON] = []



    init() {
        let baseUrlString =  "http://example.com/ios/login.php?"
        let parameters = [String:String]()

        let urlSignup = baseUrlString + "id=" + defaults.stringForKey("userID")! + "&macnumber=" + defaults.stringForKey("currentUUID")!

        //Encode url to solve spaces issues
        let urlwithPercentEscapes = urlSignup.stringByAddingPercentEncodingWithAllowedCharacters( NSCharacterSet.URLQueryAllowedCharacterSet())!
        print(urlwithPercentEscapes)
        Alamofire.request(.GET, urlwithPercentEscapes, parameters: parameters).responseJSON { response in
            if response.result.isSuccess {
                let json = JSON(response.result.value!)
                let data = json.arrayValue
                print(json)


                if json["error"] == "wrongmac" {
                    print("wrong mac")

                } else {

                    let macFromDb = json["macnumber"]
                    self.defaults.setValue(String(macFromDb), forKey: "macFromDb")

                  userDetailsDataClass.sharedInstance.user = data


                  print(String(userDetailsDataClass.sharedInstance.user.count)+"user count from alamo ")


                }

            }

            let nc = NSNotificationCenter.defaultCenter()
           nc.postNotificationName("userDataReadyForSplash", object: nil)


        }


    }



    //Create one class for shared Instance
    struct Static {
        static var onceToken : dispatch_once_t = 0
        static var instance : userDetailsDataClass? = nil
    }

    class var sharedInstance : userDetailsDataClass {
        dispatch_once(&Static.onceToken){
            Static.instance = userDetailsDataClass()
        }
        return Static.instance!
    }
}

1 个答案:

答案 0 :(得分:0)

Singleton应该直接在类中定义而不是作为子类定义(并且请为类Name中的第一个字符添加一个大写字母):

class UserDetailsDataClass {
    static let sharedInstance = UserDetailsDataClass()

    let defaults = NSUserDefaults.standardUserDefaults()
    var user: [SwiftyJSON.JSON] = []


    init() {
        let baseUrlString =  "http://example.com/ios/login.php?"
        let parameters = [String:String]()

        let urlSignup = baseUrlString + "id=" + defaults.stringForKey("userID")! + "&macnumber=" + defaults.stringForKey("currentUUID")!

        //Encode url to solve spaces issues
        let urlwithPercentEscapes = urlSignup.stringByAddingPercentEncodingWithAllowedCharacters( NSCharacterSet.URLQueryAllowedCharacterSet())!
        print(urlwithPercentEscapes)
        Alamofire.request(.GET, urlwithPercentEscapes, parameters: parameters).responseJSON { response in
            if response.result.isSuccess {
                let json = JSON(response.result.value!)
                let data = json.arrayValue
                print(json)


                if json["error"] == "wrongmac" {
                    print("wrong mac")

                } else {

                    let macFromDb = json["macnumber"]
                    self.defaults.setValue(String(macFromDb), forKey: "macFromDb")

                    UserDetailsDataClass.sharedInstance.user = data

                    // ADDITION: Try to print the whole SwiftyJSON array and see the result
                    print(UserDetailsDataClass.sharedInstance.user)

                    print(String(userDetailsDataClass.sharedInstance.user.count)+"user count from alamo ")
                }
            }

            let nc = NSNotificationCenter.defaultCenter()
            nc.postNotificationName("userDataReadyForSplash", object: nil)
        }
    }
}