如何在iOS框架的BFTask中将结果设置为数组?
我有一个方法,希望在Alamofire回调成功时返回结构数组如何在iOS框架的BFTask中将结果设置为数组?,ios,swift2,xcode7,bolts-framework,Ios,Swift2,Xcode7,Bolts Framework,我有一个方法,希望在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 media
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
时,我遇到一个名为的错误,无法将[Media]的值转换为预期参数AnyObject代码>
目前,我正在XCode 7.0 GM发行版和swift 2上运行此程序 这里的问题是task.setResult
接受AnyObject代码>,它需要类或类数组。结构不属于这一类(它实际上可以与任何
指示符一起使用)。您可以将媒体
结构转换为类,也可以将其封装在类中。在这种情况下,我建议您做一件事。我看到您似乎在使用SwiftyJSON,所以您可以做的是将json.rawData()作为任务的结果传递给用户,然后再进行处理。这是一个真实的例子。
我从数据库中获取一些数据,获取另一组基于最初获取的数据的数据,并将其作为json.rawData()发送回主函数。之后,我可以在将NSData转换回JSON后处理新数据
p、 您还可以使用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
}