2016-05-25 6 views
-1

Ich schrieb eine 2 Klassen in meiner App, die als Datenklassen durchführen müssen. Einer ist für die Benutzerdetails und einer ist für die Produkte. beide Klassen ist derselbe Code mit unterschiedlichen Namen und Variablen. Die Produktklasse funktioniert ok, aber die Benutzerklasse macht die sharedInstance für mich nicht. Die Json bekommen die Daten in Ordnung und ich kann es ausdrucken.Ein Paar Singletons in einem Swift 2 Anwendung

hier ist mein Code:

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

Vermeiden Sie Singletons, wenn Sie können. Wenn Sie nicht können, machen sie echte Singletons, wie folgt: http://StackOverflow.com/a/36012158/2227743 – Moritz

Antwort

0

Die Singleton sollte direkt in der Klasse und nicht als Unterklasse definiert werden (und bitte Versalien für das erste Zeichen in dem Klassennamen) setzen:

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) 
     } 
    } 
} 
+0

Ich habe ein wenig verwirrt damit. kannst du meinen code bearbeiten und hier posten, damit ich den hwole code sehe und verstehe? –

+0

Ich habe meine Antwort bearbeitet. Bitte versuchen Sie dies und sehen Sie, was gedruckt wird, wenn Sie 'print (UserDetailsDataClass.sharedInstance.user)' nach dem Einstellen drücken. – Artheyn

+0

hi, tnx für das Schneiden :). Ich habe Ihren Code ausprobiert und ich bekomme exaxtllly das gleiche Ergebnis. Es schafft es nicht richtig. in ich versuche userDetailsDataClass.sharedInstance.user.count Ich bekomme 0 –