2016-08-18 1 views
1

J'ai une application de travail qui prend des données d'un pList sur un serveur distant. Cependant, je veux maintenant utiliser json au lieu de plist et je me bats avec la compréhension de la façon de le faire! Toute aide très appréciée et tous les exemples géniaux.Comment j'utilise json au lieu de plist pour peupler TableView

Code sélectionné - premier téléchargement de plist et second remplissage de TableView en utilisant le plist téléchargé. Note: Je n'ai pas inclus TOUS le code.

@IBAction func startDownload(sender: AnyObject) { 
progressView.hidden = false 

    let url = NSURL(string: "http://[email protected]/Annotations/myAnnotationsKalkan.plist")! 
    downloadTask = backgroundSession.downloadTaskWithURL(url) 
    downloadTask.resume() 
} 

func showFileWithPath(path: String){ 
    let isFileFound:Bool? = NSFileManager.defaultManager().fileExistsAtPath(path) 
    if isFileFound == true{ 
     let viewer = UIDocumentInteractionController(URL: NSURL(fileURLWithPath: path)) 
     viewer.delegate = self 
     viewer.presentPreviewAnimated(true) 
     // print("file is found") 
    } 
} 

@IBOutlet var progressView: UIProgressView! 
override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

// 1 
func URLSession(session: NSURLSession, 
    downloadTask: NSURLSessionDownloadTask, 
    didFinishDownloadingToURL location: NSURL){ 

    let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) 
    let documentDirectoryPath:String = path[0] 
    let fileManager = NSFileManager() 
    let destinationURLForFile = NSURL(fileURLWithPath: documentDirectoryPath.stringByAppendingString("/myAnnotationsKalkan.plist.plist")) 

    if fileManager.fileExistsAtPath(destinationURLForFile.path!){ 
     showFileWithPath(destinationURLForFile.path!) 
    } 
    else{ 
     do { 
      try fileManager.moveItemAtURL(location, toURL: destinationURLForFile) 
//    show file 
      showFileWithPath(destinationURLForFile.path!) 
     }catch{ 
      print("An error occurred while moving file to destination url") 
     } 
    } 
} 

// 2 
func URLSession(session: NSURLSession, 
       downloadTask: NSURLSessionDownloadTask, 
       didWriteData bytesWritten: Int64, 
          totalBytesWritten: Int64, 
          totalBytesExpectedToWrite: Int64){ 
    progressView.setProgress(Float(totalBytesWritten)/Float(totalBytesExpectedToWrite), animated: true) 
} 

func URLSession(session: NSURLSession, 
       task: NSURLSessionTask, 
       didCompleteWithError error: NSError?){ 
    downloadTask = nil 
    progressView.setProgress(0.0, animated: true) 

    if (error != nil) { 
     print(error?.description) 
    }else{ 
     // print("The task finished transferring data successfully") 
     progressView.hidden = true 
    } 
} 


// TableViewController.swift 
    /museumTemplate 

// 

import UIKit 


class MyTableViewController: UITableViewController { 

var titleData = [String]() 
var subTitleData = [String]() 
var stateData = [String]() 
var codeData = [String]() 
var infoData = [String]() 
var openData = [String]() 
var phoneData = [String]() 
var emailData = [String]() 
var webData = [String]() 
var latData = [Double]() 
var lonData = [Double]() 

var titleToPass = [String]() 
var thisState = [String]() 
var stateOrAlpha = "" 
var titleText = "" 


override func viewDidLoad() { 
    super.viewDidLoad() 

navigationItem.title = titleText 

    let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString 
    let sourcePath = documentsPath.stringByAppendingPathComponent("myAnnotationsKalkan.plist.plist") 

    if let content = NSArray(contentsOfFile: sourcePath as String){ 


    let descriptor = NSSortDescriptor(key: stateOrAlpha, ascending: true) 
    let myMuseum = content.sortedArrayUsingDescriptors([descriptor]) 

     for item in myMuseum{ 
       titleData.append(item.objectForKey("title") as! String) 
       subTitleData.append(item.objectForKey("subtitle") as! String) 
       infoData.append(item.objectForKey("info") as! String) 
       phoneData.append(item.objectForKey("phone") as! String) 
       webData.append(item.objectForKey("web") as! String) 
       emailData.append(item.objectForKey("email") as! String) 
       latData.append(item.objectForKey("latitude") as! Double) 
       lonData.append(item.objectForKey("longitude") as! Double) 
      } 
     } 
    } 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    // Return the number of sections. 
    return 1 
} 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    // Return the number of rows in the section. 
    return titleData.count 
} 

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
let cell = tableView.dequeueReusableCellWithIdentifier("tableCell", forIndexPath: indexPath) as UITableViewCell 

    // Configure the cell..title and subTitle. 
    cell.textLabel!.text = titleData[indexPath.row] 
    return cell 
    } 
+0

Il est l'habitude de programmation assez mauvais pour utiliser des tableaux 13 en tant que source de données (!). Swift est un langage orienté objet, utilisez donc une classe ou une structure personnalisée. Contrairement à la liste des propriétés, un fichier JSON est un texte brut. Vous pouvez utiliser 'dataTask' plutôt que' downloadTask' et vous devez convertir (désérialiser) le texte en tableau ou en dictionnaire. – vadian

+0

Merci pour les conseils et infos – PhilipS

+0

J'aurais dû ajouter que j'utilise une classe personnalisée dans un code similaire dans d'autres applications. Celui-ci que j'expérimente et est rapide et sale :-) – PhilipS

Répondre

0

J'ai essayé ce code pour le téléchargement d'un simple fichier JSON à partir d'un serveur et il semble fonctionner:

override func viewDidLoad() { 
    super.viewDidLoad() 

    let requestURL: NSURL = NSURL(string: "http://[email protected]/Annotations/testData4.json")! 
    let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL) 
    let session = NSURLSession.sharedSession() 
    let task = session.dataTaskWithRequest(urlRequest) { 
     (data, response, error) -> Void in 
    let httpResponse = response as! NSHTTPURLResponse 
    let statusCode = httpResponse.statusCode 

     if (statusCode == 200) { 
      print("File downloaded.") 
    //   print(testData4.json) 
      do{ 

       let json = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments) 

       if let users = json["users"] as? [[String: AnyObject]] { 
        for user in users { 
         if let name = user["name"] as? String { 
         if let subtitle = user["subtitle"] as? String { 
         print(name,subtitle) 
          } 
         } 
        } 
       }  
      }catch { 
       print("Error with Json: \(error)") 
      } 
     } 
    } 
    task.resume() 
} 
1

j'utilise Alamofire Wich est plus facile et sécuritaire de le faire des requêtes Web, mais voici un code sans elle:

let urlPath = "YourUrlRequest" 
      let session = NSURLSession.sharedSession() 
      let url = NSURL(string: urlPath)! 
      session.dataTaskWithURL(url) {(data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in 

       if let responseData = data { 
       do { 
        let jsonObject = try NSJSONSerialization.JSONObjectWithData(responseData, options: []) as! NSArray 
        for dataDict : AnyObject in jsonObject { 

         let idj: String = dataDict.objectForKey("id") as!String 
         let namej: String = dataDict.objectForKey("name") as! String 
         let indicativej: String = dataDict.objectForKey("indicative") as! String 
         let flagj: String = dataDict.objectForKey("flag") as! String 
         saveCountryFromWeb(idj, name: namej, indicative: indicativej, flag: flagj) 

        } 
       } catch let error as NSError { 
        print("Failed to load: \(error.localizedDescription)") 
       } 
       } 

      }.resume() 

espère que les aide, dites-moi si vous voulez un échantillon avec alamofire que je recommande;)

+0

Kika_Fortez N'a pas utilisé Alamofire, donc oui s'il vous plaît re: un échantillon. Bien que mon intention est d'utiliser Firebase pour l'accès aux données lorsque je trier les choses. Merci pour votre aide positive – PhilipS

+0

ok, donc pour récupérer des données avec firebase vous n'avez pas besoin de les utiliser car firebase a ses méthodes par défaut donc je vais mettre un exemple de base de feu. S'il vous plaît mettre un chèque comme la bonne réponse. –

+0

Enfin trouvé un peu de temps à jouer avec votre code. Je reçois une erreur avec cette ligne laissez jsonObject = essayez NSJSONSerialization.JSONObjectWithData (responseData, options: []) as! NSArray SIGABRT - Impossible de convertir la valeur de type '__NSCFDictionary' (0x44c5c0) en 'NSArray' (0x44c2f0). – PhilipS

1
func retrieveBarcodeData(){ 

    let databaseref = FIRDatabase.database().reference() 
    databaseref.child("barcodes").queryOrderedByKey().observeEventType(.ChildAdded, withBlock: { 
     snapshot in 


     let codig = snapshot.value!["codigo"] as! String 
     let desc = snapshot.value!["designacao"] as! String 
     let Url = snapshot.value!["ImageURL"] as! String 

     barcodes.insert(BarCodeStruct(code: codig, description: desc, ImageURL: Url),atIndex: 0) 
     self.tableView.reloadData() 



    }) 

} 

ne pas oublier de configurer votre base de données firebase et installer firebase avec cocoapods et mettre FIRApp.configure() dans votre appDelegate didFinishLaunchingWithOptions