初始化未调用自定义 a class swift
init not called on custom a class swift
class Facts {
var networkOperaton = NetworkOperation(url: "http://fact.tayfunturanligil.com")
var factsArray : [String] = []
init () {
self.networkOperaton.downloadJSONFromURL({
(a:[String]) -> [String] in
println(a)
self.factsArray = a
return a
})
}
}
当我想使用 var facts = Facts()
在我的 ViewController 中创建 Facts 实例时,factsArray
保持为空数组。但它应该从 downloadJSONFromURL
函数中获取一个数组。为什么会这样?连我的println(a)
都不叫。
我在 playground 中测试了 downloadJSONFromURL
功能并且它有效。另外,networkOperation
使用 NSURLSession
,这会是个问题吗?
init()
被调用,但 downloadJSONFromURL()
是一个异步方法。
这意味着 init()
returns 在调用 downloadJSONFromURL()
后立即 Facts
实例而不等待完成。
实际上调用了init()
方法。试试这个代码:
class Facts {
var factsArray : [String] = []
init () {
println("Init called")
factsArray = ["Hello", "World", "Bye", "World"]
}
}
ViewController.swift:
override func viewDidLoad() {
super.viewDidLoad()
var facts = Facts()
println(facts.factsArray)
}
您的代码存在的问题是网络操作在异步模式下会 运行。您可以在函数中定义另一个方法,而不是在 init 方法中发出网络请求,然后可以 return 完成块中的请求状态。
func updateArrayFromNetwork(completion: (Bool) -> ()) {
var networkOperaton = NetworkOperation(url: "http://fact.tayfunturanligil.com")
self.networkOperaton.downloadJSONFromURL({
(a:[String]) -> [String] in
println(a)
self.factsArray = a
completion(true)
})
}
ViewController.swift
override func viewDidLoad() {
super.viewDidLoad()
var facts = Facts()
println(facts.factsArray)
facts.updateArrayFromNetwork { (completed: Bool) -> () in
if completed {
//Do something
}
}
}
class Facts {
var networkOperaton = NetworkOperation(url: "http://fact.tayfunturanligil.com")
var factsArray : [String] = []
init () {
self.networkOperaton.downloadJSONFromURL({
(a:[String]) -> [String] in
println(a)
self.factsArray = a
return a
})
}
}
当我想使用 var facts = Facts()
在我的 ViewController 中创建 Facts 实例时,factsArray
保持为空数组。但它应该从 downloadJSONFromURL
函数中获取一个数组。为什么会这样?连我的println(a)
都不叫。
我在 playground 中测试了 downloadJSONFromURL
功能并且它有效。另外,networkOperation
使用 NSURLSession
,这会是个问题吗?
init()
被调用,但 downloadJSONFromURL()
是一个异步方法。
这意味着 init()
returns 在调用 downloadJSONFromURL()
后立即 Facts
实例而不等待完成。
实际上调用了init()
方法。试试这个代码:
class Facts {
var factsArray : [String] = []
init () {
println("Init called")
factsArray = ["Hello", "World", "Bye", "World"]
}
}
ViewController.swift:
override func viewDidLoad() {
super.viewDidLoad()
var facts = Facts()
println(facts.factsArray)
}
您的代码存在的问题是网络操作在异步模式下会 运行。您可以在函数中定义另一个方法,而不是在 init 方法中发出网络请求,然后可以 return 完成块中的请求状态。
func updateArrayFromNetwork(completion: (Bool) -> ()) {
var networkOperaton = NetworkOperation(url: "http://fact.tayfunturanligil.com")
self.networkOperaton.downloadJSONFromURL({
(a:[String]) -> [String] in
println(a)
self.factsArray = a
completion(true)
})
}
ViewController.swift
override func viewDidLoad() {
super.viewDidLoad()
var facts = Facts()
println(facts.factsArray)
facts.updateArrayFromNetwork { (completed: Bool) -> () in
if completed {
//Do something
}
}
}