在 MVC 中获取和解析功能位置
Fetching and parsing functionality location in MVC
我需要从 rss 加载数据并将其显示在 tableview 中。我决定在其他 class 而不是 ViewController 中进行。所以我创建了 DataFetch class。问题是我使用第三方库来处理 rss,它是这样工作的:
func fetchPodcastFeed() -> [RSSFeedItem]{
let feedURL = NSURL(string: feedURLString)!
var feedItems = [RSSFeedItem]()
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), {
// Run parsing in a background thread
FeedParser(URL: feedURL)?.parse({ (result) in
feedItems = (result.rssFeed?.items)!
dispatch_async(dispatch_get_main_queue(), { () -> Void in
//reload table
})
})
})
return feedItems
}
当然,当我从 ViewController 调用 fetchItems = dataFetcher.fetchPodcastFeed()
时,我没有得到任何数据。我应该使用通知吗?如果是,如何通过它们将获取的数据传递给 ViewController?或者有更好的方法吗?
所以我假设 fetchPodcastFeed()
函数是您的代码,对吧?
然后我建议用这样的回调来定义它:
func fetchPodcastFeed(onCompletion:(result:[RSSFeedItem]) -> Void) {
// setup as you have it ...
dispatch_async(dispatch_get_main_queue(), { () -> Void in
// call the completion closure
onCompletion(feedItems)
})
})
})
}
然后,无论您在哪里调用该方法,都按如下方式进行:
fetchPodcastFeed({(result) in
// reload your table with result, which is of type [RSSFeedItem]
})
理论上,您也可以简单地将完成处理程序直接传递到您在 FeedParser
对象上调用的 parse
方法中,但是由于您在后台线程上,因此先发送可能更明智它再次到主线程。否则你必须将重新加载 table 的东西放在 dispatch_async
调用中,这样开始更好。
我需要从 rss 加载数据并将其显示在 tableview 中。我决定在其他 class 而不是 ViewController 中进行。所以我创建了 DataFetch class。问题是我使用第三方库来处理 rss,它是这样工作的:
func fetchPodcastFeed() -> [RSSFeedItem]{
let feedURL = NSURL(string: feedURLString)!
var feedItems = [RSSFeedItem]()
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), {
// Run parsing in a background thread
FeedParser(URL: feedURL)?.parse({ (result) in
feedItems = (result.rssFeed?.items)!
dispatch_async(dispatch_get_main_queue(), { () -> Void in
//reload table
})
})
})
return feedItems
}
当然,当我从 ViewController 调用 fetchItems = dataFetcher.fetchPodcastFeed()
时,我没有得到任何数据。我应该使用通知吗?如果是,如何通过它们将获取的数据传递给 ViewController?或者有更好的方法吗?
所以我假设 fetchPodcastFeed()
函数是您的代码,对吧?
然后我建议用这样的回调来定义它:
func fetchPodcastFeed(onCompletion:(result:[RSSFeedItem]) -> Void) {
// setup as you have it ...
dispatch_async(dispatch_get_main_queue(), { () -> Void in
// call the completion closure
onCompletion(feedItems)
})
})
})
}
然后,无论您在哪里调用该方法,都按如下方式进行:
fetchPodcastFeed({(result) in
// reload your table with result, which is of type [RSSFeedItem]
})
理论上,您也可以简单地将完成处理程序直接传递到您在 FeedParser
对象上调用的 parse
方法中,但是由于您在后台线程上,因此先发送可能更明智它再次到主线程。否则你必须将重新加载 table 的东西放在 dispatch_async
调用中,这样开始更好。