Ios 未在自定义类swift上调用init
当我想使用Ios 未在自定义类swift上调用init,ios,swift,initialization,Ios,Swift,Initialization,当我想使用var Facts=Facts()在ViewController中创建事实的实例时,factsArray保持为空数组。但它应该从downloadJSONFromURL函数中获取一个数组。为什么会这样?甚至不调用myprintln(a) 我在一个操场上测试了downloadJSONFromURL函数,它运行正常。另外,networkOperation使用NSURLSession,这可能是一个问题吗?init()被调用,但downloadJSONFromURL()是一个异步方法。 这意味着
var Facts=Facts()
在ViewController中创建事实的实例时,factsArray
保持为空数组。但它应该从downloadJSONFromURL
函数中获取一个数组。为什么会这样?甚至不调用myprintln(a)
我在一个操场上测试了downloadJSONFromURL
函数,它运行正常。另外,networkOperation
使用NSURLSession
,这可能是一个问题吗?init()
被调用,但downloadJSONFromURL()
是一个异步方法。这意味着
init()
在调用downloadJSONFromURL()
后立即返回Facts
实例,而不等待完成。实际调用了init()
方法。请尝试以下代码:
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
})
}
}
ViewController.swift:
class Facts {
var factsArray : [String] = []
init () {
println("Init called")
factsArray = ["Hello", "World", "Bye", "World"]
}
}
代码的问题是网络操作将以异步模式运行。您可以在函数中定义另一个方法,然后在完成块中返回请求的状态,而不是在init方法中发出网络请求
override func viewDidLoad() {
super.viewDidLoad()
var facts = Facts()
println(facts.factsArray)
}
ViewController.swift
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)
})
}
你有问题吗?对不起,我不太清楚。我希望为factsArray分配一个数组,但它没有。我认为我的整个init函数没有被调用,因为println(a)从未被调用。为什么会发生这种情况?将print test放在init之后,而不是下面的hanks部分。这就解决了问题。但是出现了一些新问题。1) 该应用程序现在速度非常慢(如果我使用NSData而不是NSURLSESION.2,速度会非常快)。我的networkOperation init()中有一个println(“network init done”)语句,但我看到network init done语句两次。3) 我不需要使用dispatch\u async(dispatch\u get\u main\u queue()函数somewere。再次感谢您的帮助
NSData(contentsOfURL:NSURL,options:NSDataReadingOptions,error:NSErrorPointer)
通常用于从本地url加载数据(来自本地存储的文档文件夹或任何其他文件。必须使用NSURLSession的sendAsynchronousRequest:[link][1][1]:
override func viewDidLoad() {
super.viewDidLoad()
var facts = Facts()
println(facts.factsArray)
facts.updateArrayFromNetwork { (completed: Bool) -> () in
if completed {
//Do something
}
}
}