1

我有一个方法,我想在 Alamofire 回调成功时返回结构数组。

func getPopularMedias() -> BFTask {
  let instaUrl: String = "https://api.instagram.com/v1/media/popular"
  let user: PFUser = currentUser()
  let accessToken = user.objectForKey("accessToken") as! String
  var medias: [Media] = []

  let task = BFTaskCompletionSource()

  Alamofire.request(.GET, instaUrl, parameters: ["access_token": accessToken])
    .responseJSON { request, response, data in
      var json = JSON(data.value!)

      for(_, subJson): (String, JSON) in json["data"] {
        let image: UIImage = NSURL(string: subJson["images"]["low_resolution"]["url"].stringValue)
        .flatMap { NSData(contentsOfURL: $0) }
        .flatMap { UIImage(data: $0) }!

      let profileImage: UIImage = NSURL(string: subJson["user"]["profile_picture"].stringValue)
        .flatMap { NSData(contentsOfURL: $0) }
        .flatMap { UIImage(data: $0) }!

      medias.append(Media(name: subJson["user"]["full_name"].stringValue, image: image, profileImage: profileImage))
    }
    task.setResult(medias)
}
return task.task
}

设置时task.setResult我收到一个错误,称为cannot convert value of [Media] to expected argument AnyObject!

目前我在 XCode 7.0 GM 版本和 swift 2 上运行它。

4

2 回答 2

1

这里的问题是task.setResult需要AnyObject!类或类数组。结构不属于这一类(它实际上可以与Any指示符一起使用)。您可以将Media结构转换为类,也可以将其封装在类中。

于 2015-10-26T07:15:14.940 回答
0

在这种特殊情况下,我建议您做一件事。我看到您似乎正在使用 SwiftyJSON,所以您可以做的是您可以将 json.rawData() 作为任务的结果传递并在之后处理它。这是一个真实的例子。我从我的数据库中获取一些东西,获取另一组基于最初获取的数据的数据,并将其作为 json.rawData() 发送回主函数。之后,一旦我将 NSData 转换回 JSON,我就能够处理我的新数据。

ps 你也可以使用completionHandler,它可以让你返回任何你想要的东西。

func startLoadingItunesDataFor(postsQuery: PFQuery, completionHandler: ((posts: [Post]) -> Void)) {
  var newPosts = [Post]()
  postsQuery.findObjectsInBackground().continueWithSuccessBlock({ (task: BFTask!) -> AnyObject! in
    var tasks = [BFTask]()
    if let result = task.result {
      let posts = result as! [PFObject]
      for post in posts {
        let tempPost = Post(
          //////
        )
        newPosts.append(tempPost)
        tasks.append(self.getMovieInfoByITunesID(post["trackID"] as! Int))
      }
    }
    return BFTask(forCompletionOfAllTasksWithResults: tasks)
  }).continueWithSuccessBlock({ (task: BFTask!) -> AnyObject! in
    let results = task.result as! NSArray
    for (index, postData) in results.enumerate() {
      let json = JSON(data: postData as! NSData)
       ////
    }
    completionHandler(posts: newPosts)
    return nil
  })

}



func getMovieInfoByITunesID(iTunesID: Int) -> BFTask {
  let mainTask = BFTaskCompletionSource()
  ITunesApi.lookup(iTunesID).request({ (responseString: String?, error: NSError?) -> Void in
    if
      //        error == nil,
      let responseString = responseString, let dataFromString = responseString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) {
        let json = JSON(data: dataFromString)

        do {
          try mainTask.setResult(json["results"][0].rawData())
        }
        catch {
        }
    } else {
      // process error
    }
  })
  return mainTask.task
}
于 2015-10-26T07:34:32.713 回答