2015-08-16 54 views
2
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 
     }) 
    } 
} 

。但它應該從downloadJSONFromURL函數獲得數組。爲什麼發生這種情況?即使我的println(a)未被調用。INIT不叫自定義一個類迅速

我在操場上測試了downloadJSONFromURL函數,它工作正常。另外,networkOperation使用NSURLSession,這可能是一個問題?

+0

你有問題嗎? – user52889

+0

抱歉不清楚。我希望我的factsArray被分配一個數組,但事實並非如此。我認爲我的整個init函數沒有被調用,因爲println(a)永遠不會被調用。爲什麼會發生這種情況? – tTIKA

+0

把初始化後的打印測試,不在下面的部分 – Ben

回答

1

實際上調用了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方法中進行網絡請求,您可以在函數中定義另一個方法,然後可以在完成塊中返回請求的狀態。

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 
     } 
    } 
} 
+0

謝謝。這解決了這個問題。但出現了一些新問題。 1)該應用程序現在非常慢(如果我使用NSURLSeesion內置的NSData,速度會很快)2)我的networkOperation init()中有一個println(「network init done」)語句,但是我看到網絡init完成語句兩次。 3)我不需要使用dispatch_async(dispatch_get_main_queue()函數somewere。再次感謝您的幫助 – tTIKA

+0

'NSData(contentsOfURL:NSURL,選項:NSDataReadingOptions,錯誤:NSErrorPointer)'通常用於加載本地url(Documents文件夾或您必須使用NSURLSession的sendAsynchronousRequest:[link] [1] [1]:https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURLConnection_Class /#// apple_ref/OCC/CLM/NSURLConnection的/ sendAsynchronousRequest:隊列:completionHandler: – meteors

0

init()被調用,但downloadJSONFromURL()是一種異步方法。
這意味着init()在調用downloadJSONFromURL()後立即返回Facts實例,無需等待完成。