Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 未在自定义类swift上调用init_Ios_Swift_Initialization - Fatal编程技术网

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
函数中获取一个数组。为什么会这样?甚至不调用my
println(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
        }
    }
}