在MVC中获取和解析功能位置

时间:2016-06-30 19:03:39

标签: ios swift model-view-controller rss

我需要从rss加载数据并在tableview中显示它。我决定在其他类中而不是在ViewController中执行此操作。所以我创建了DataFetch类。问题是我使用第三方库来处理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?或者有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

所以我假设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]
})

从理论上讲,您也可以直接将完成处理程序直接传递到您在parse对象上调用的FeedParser方法,但由于您处于后台线程,因此可能更聪明地再次将其发送到主线程。否则,您必须将重新加载的表格放入dispatch_async来电,这比您开始的方式更好。