【发布时间】:2015-08-04 09:29:10
【问题描述】:
我正在使用 Twitter API 来检索推文列表。该方法应该返回推文列表,但问题是它在请求结束之前返回,这导致返回一个空列表。我该如何解决?以下是该方法的源代码:
// Call to search through twitter with a query
func searchQuery(query: String) -> [Tweet] {
var tweets: [Tweet] = []
var query_URL = query.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())
if let query_URL = query_URL {
TwitterClient.sharedInstance.GET("https://api.twitter.com/1.1/search/tweets.json?q=\(query_URL)", parameters: nil, success: { (operation: AFHTTPRequestOperation!, response: AnyObject!) -> Void in
tweets = parseJSON(response)
println(tweets.count)
}, failure: { (operation: AFHTTPRequestOperation!, error: NSError!) -> Void in
})
}
println("ret: \(tweets.count)")
return tweets
}
在上面的代码中,输出将是
ret: 0
15
我尝试过使用调度组,但无法让它们工作。以下是我对 GCD 所做的:
// Call to search through twitter with a query
func searchQuery(query: String) -> [Tweet] {
var tweets: [Tweet] = []
var query_URL = query.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())
var group = dispatch_group_create()
if let query_URL = query_URL {
dispatch_group_enter(group)
TwitterClient.sharedInstance.GET("https://api.twitter.com/1.1/search/tweets.json?q=\(query_URL)", parameters: nil, success: { (operation: AFHTTPRequestOperation!, response: AnyObject!) -> Void in
tweets = parseJSON(response)
dispatch_group_leave(group)
}, failure: { (operation: AFHTTPRequestOperation!, error: NSError!) -> Void in
dispatch_group_leave(group)
})
}
dispatch_group_wait(group, DISPATCH_TIME_FOREVER)
return tweets
}
但是,该代码似乎永远等待。
作为参考,Tweet 是一个用于保存与推文相关的数据的结构。我用它以更紧凑的方式移动大量数据。 parseJSON 根据 JSON 响应填充并返回一组推文。理想情况下,返回的数组将保存到 tweets,然后它应该从方法返回,但这不会发生。
任何克服这个问题的想法或技术将不胜感激!
编辑:@Hamza Ansari 这是实际的功能:
// Call to search through twitter with a query
func searchQuery(query: String, completionHandler:(returntweets: [Tweet]) -> Void) {
var query_URL = query.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())
if let query_URL = query_URL {
TwitterClient.sharedInstance.GET("https://api.twitter.com/1.1/search/tweets.json?q=\(query_URL)", parameters: nil, success: { (operation: AFHTTPRequestOperation!, response: AnyObject!) -> Void in
var tweets:[Tweet] = parseJSON(response)
println("size in method: \(tweets.count)")
completionHandler(returntweets: tweets)
}, failure: { (operation: AFHTTPRequestOperation!, error: NSError!) -> Void in
})
}
}
但是,当在用于初始化数据源的不同方法中调用时:
// Initializes the data source
func initialize(query: String) {
self.query = query
searchQuery(query, { (returnTweets) -> Void in
self.searches = returnTweets
})
println("size when called: \(searches.count)")
}
输出(按顺序):
size when called: 0
size in method: 15
【问题讨论】:
-
看看昨天问的类似问题:stackoverflow.com/questions/31794542/…
-
这里有一个提示:您用于获取推文的
GET方法就是这样做的(异步获取一些数据),您可以 cmd+单击它并了解如何操作有用。另请注意,异步函数(几乎)永远不会返回某些内容(毕竟这是异步背后的想法) -
您需要从闭包中调用一些方法来处理已检索到的推文。
-
这是因为您在块外使用
println("size when called: \(searches.count)") -
searchQuery(query, { (returnTweets) -> Void in self.searches = returnTweets println("size when called: \(searches.count)" })
标签: ios swift asynchronous grand-central-dispatch