Reputation: 163
I am pretty new to Swift.
(a) I have been able to use table view to load numbers from an array into a table.
(b) I have been able to read a text file from the web and load it into an array.
However, I want the array in (b), which is created from the web text file, to be viewed in (a), which is the table view.
There seems no communication between section (a) and (b) in my code.
Could you please help?
//MAIN CLASS
import UIKit
//CHUNK 0
class ViewController: UITableViewController {
var candies = [Candy]()
//CHUNK 1
override func viewDidLoad() {
super.viewDidLoad()
// CHUNK 1.2
let request = NSMutableURLRequest(URL: NSURL(string: "http://www.saifahmad.com/A.txt")!)
httpGet(request){
(data, error) -> Void in
if error != nil {
print(error)
} else {
//print(data)//PRINTING ALL DATA TO CONSOLE
let delimiter = "\t" // Read a tab-delimited text file
// self.items = []
let lines:[String] = data.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet()) as [String]
var ar = [Double]()
for line in lines {
var values:[String] = []
if line != "" {
values = line.componentsSeparatedByString(delimiter)
// Put the values into the tuple and add it to the items array
let str = (values[1])//CHOOSE THE COLUMN TO PRINT (0, 1, 2)
// Convert string to double
let db = NSNumberFormatter().numberFromString(str)?.doubleValue
ar.append(db!)
}
}
dump(ar) // THIS ARRAY 'AR' PRINTS OK HERE BUT CANNOT BE ACCESSED IN CHUNK 1.3
}
}
// CHUNK 1.2
//CHUNK 1.3
// CANNOT ACCESS ARRAY 'AR' OF CHUNK 1.2 HERE
let ar2: [Double] = [0, 0.004, 0.008, 0.012, 0.016, 0.02, 0.024, 0.028, 0.032, 0.036, 0.04]
for nn in ar2 {
self.candies.append(Candy(name: String(format:"%.4f", nn)))
}
//CHUNK 1.3
}
//CHUNK 1
//CHUNK 2
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
//CHUNK 2
//CHUNK 3
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.candies.count
}
//CHUNK 3
//CHUNK 4
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
var candy : Candy
candy = candies[indexPath.row]
cell.textLabel?.text = candy.name
return cell
}
//CHUNK 4
//CHUNK 5
func httpGet(request: NSURLRequest!, callback: (String, String?) -> Void) {
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(request){
(data, response, error) -> Void in
if error != nil {
callback("", error!.localizedDescription)
} else {
let result = NSString(data: data!, encoding:
NSASCIIStringEncoding)!
callback(result as String, nil)
}
}
task.resume()
}
//CHUNK 5
}
//CHUNK 0
//CANDY CLASS
import Foundation
struct Candy {
let name : String
}
Upvotes: 1
Views: 789
Reputation: 2856
So your problem is that you declare the array ar inside your closure for the request. So it only exists in the closure. You have two options: make an array outside of viewDidLoad and set it once you have the complete array, then use didSet to set candies, or you can do all the setup for candies inside the closure (see below). I would put a didSet with candies anyways to reload your tableView.
var candies = [Candy]() {
didSet {
tableView.reloadData()
}
}
override func viewDidLoad() {
super.viewDidLoad()
// CHUNK 1.2
let request = NSMutableURLRequest(URL: NSURL(string: "http://www.saifahmad.com/A.txt")!)
httpGet(request){ (data, error) -> Void in
if error != nil {
print(error)
} else {
let delimiter = "\t" // Read a tab-delimited text file
let lines:[String] = data.componentsSeparatedByCharactersInSet(NSCharacterSet.newlineCharacterSet()) as [String]
var ar = [Double]()
for line in lines {
var values:[String] = []
if line != "" {
values = line.componentsSeparatedByString(delimiter)
// Put the values into the tuple and add it to the items array
let str = (values[1])//CHOOSE THE COLUMN TO PRINT (0, 1, 2)
// Convert string to double
let db = NSNumberFormatter().numberFromString(str)?.doubleValue
ar.append(db!)
}
}
for nn in ar {
self.candies.append(Candy(name: String(format:"%.4f", nn)))
}
}
}
}
Upvotes: 1