2016-02-07 9 views
-3

Я новичок в Swift, и я пытаюсь добавить блок завершения. Я помню, что это довольно просто в объективе-c, но я немного потерял синтаксис здесь. Эта функция анализирует некоторые json и добавляет соответствующий контент в массив. Мне нужно обновить представление таблицы, как только функция будет завершена, так как я не могу сделать это в блоке, мне нужно добавить блок завершения.Добавление блока завершения в fuction в 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) 
} 

Or еще более лаконично:

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', поэтому он вызывается после завершения цикла. Кроме того, вероятно, лучше, если вы не используете опции с вашим обработчиком, таким образом вам не придется их распаковывать позже. –

Смежные вопросы