2016-02-07 62 views
-3

我是新來的Swift,我試圖添加一個完成塊。我記得在Objective-C中這很簡單,但我有點在這裏的語法丟失。該函數解析一些json並將相關內容添加到數組中。一旦函數完成,我需要刷新一個tableview,因爲我不能在塊內完成這個工作,我需要添加一個完成塊。在Swift中添加完成塊功能

如何在Swift中爲此函數添加完成塊,以及新的方法調用將如何?

func getSetParameter() 
{ 
    let param = ["format":"json"] 
    let jsonUrl: String! = "http://somewebsite.com" 

    let manager: AFHTTPSessionManager = AFHTTPSessionManager() 
    manager.GET(jsonUrl, parameters: param, success: { 
     (task: NSURLSessionDataTask!, JSONResponse: AnyObject!) in 

      let responseDictionary = JSONResponse as! NSDictionary 
      let responseArray = responseDictionary.objectForKey("response") as! NSArray 
      for thumbnailsOnVideoDictionary in responseArray 
      { 
       let thumbnailsOnVideoArray = thumbnailsOnVideoDictionary.objectForKey("thumbnails") as! NSArray 
       if thumbnailsOnVideoArray.count == 0 { 
        self.thumbnails.append(nil) 
       } 
       else { 
        let smallThumbnail = thumbnailsOnVideoArray[1]; 
        let aspect_ratio: Float = (smallThumbnail.objectForKey("aspect_ratio") as! Float) 
        let height: UInt = (smallThumbnail.objectForKey("height") as! UInt) 
        let name: AnyObject = smallThumbnail.objectForKey("name")! 
        let url: String = (smallThumbnail.objectForKey("url") as! String) 
        let width: UInt = (smallThumbnail.objectForKey("width") as! UInt) 

        let newThumbnail = Thumbnail(aspect_ratio: aspect_ratio, height: height, name: name, url: url, width: width) 
        self.thumbnails.append(newThumbnail) 
       } 
      } 
     }, failure: {(task: NSURLSessionDataTask?, error: NSError!) in 

    }) 
} 
+1

真的只是一樣http://stackoverflow.com/questions/30133490/run-code-only-after-asynchronous-function-finishes-executing – matt

回答

2

handler的參數更新你的函數。在這個例子中,我使用的則傳遞縮略圖的陣列封閉,並且沒有返回值:

func getSetParameter(handler:([Thumbnail]) ->()) { 

    // generate an array of Thumbnails 
    let someArray = [Thumbnail(), Thumbnail()] 

    // call the handler, passing the array 
    handler(someArray) 
} 

由於最後一個參數是一個閉包,你可以使用雨燕的尾部封語法:

// call the function 

getSetParameter { thumbnails in 
    print(thumbnails) 
} 

或者更簡潔:

getSetParameter { 
    print($0) 
} 

更詳細的版本的這個(沒有尾隨閉包語法)也適用:

getSetParameter({ (thumbnails) ->() in 
    print(thumbnails) 
}) 

但在我看來,這是非常醜陋的。

+0

我只是嘗試這樣做,但我不知道怎麼樣處理程序與完成塊類似。 – kiaraRobles

-2

不知道如何在處理程序中使用閉包,self.getSetParameter函數的括號中的代碼在函數本身之前被調用。而不是完成該功能。

override func viewDidLoad() 
{ 
    self.getSetParameter { (thumbnails: [Thumbnail?]) ->() in 
     for var index = 0; index < thumbnails.count; ++index { 
      let currentThumbnail = thumbnails[index] 

      var title: String 
      var image: UIImage 
      if currentThumbnail!.isKindOfClass(Thumbnail) { 
       title = "Title " + String(index) 
       image = currentThumbnail!.image 
      } 
      else { 
       title = "Nil" 
       image = UIImage(named: "image0")! 
      } 

      self.models.append(CustomCell(title: title, image: image)) 
     } 
    } 
} 

func getSetParameter(handler:([Thumbnail?]) ->()) { 
    var thumbnails = [Thumbnail?]() 
    let param = ["format":"json"] 
    let jsonUrl: String! = "http://somewebsite.com" 

    let manager: AFHTTPSessionManager = AFHTTPSessionManager() 
    manager.GET(jsonUrl, parameters: param, success: { 
     (task: NSURLSessionDataTask!, JSONResponse: AnyObject!) in 

      let responseDictionary = JSONResponse as! NSDictionary 
      let responseArray = responseDictionary.objectForKey("response") as! NSArray 
      for thumbnailsOnVideoDictionary in responseArray 
      { 
       let thumbnailsOnVideoArray = thumbnailsOnVideoDictionary.objectForKey("thumbnails") as! NSArray 
       if thumbnailsOnVideoArray.count == 0 { 
        thumbnails.append(nil) 
       } 
       else { 
        let smallThumbnail = thumbnailsOnVideoArray[1]; 
        let aspect_ratio: Float = (smallThumbnail.objectForKey("aspect_ratio") as! Float) 
        let height: UInt = (smallThumbnail.objectForKey("height") as! UInt) 
        let name: AnyObject = smallThumbnail.objectForKey("name")! 
        let url: String = (smallThumbnail.objectForKey("url") as! String) 
        let width: UInt = (smallThumbnail.objectForKey("width") as! UInt) 

        let newThumbnail = Thumbnail(aspect_ratio: aspect_ratio, height: height, name: name, url: url, width: width) 
        thumbnails.append(newThumbnail) 
       } 
       handler(thumbnails) 
      } 
     }, failure: {(task: NSURLSessionDataTask?, error: NSError!) in 

    }) 
} 
+0

這會多次調用'handler',這是意想不到的。嘗試在'for'循環之外移動'handler',所以一旦循環完成就調用它。另外,如果你不在處理程序中使用可選項,那可能會更好,這樣你以後就不必打開它們。 –