测试已测试 | ✓ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布最后发布 | 2017年3月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由Rob Seward维护。
用于在iOS中消费和显示RSS源的应用程序框架
FeedCache是CoreData管理分页RSS源数据的替代品。在架构上,它取代了NSFetchedResultsController,同时使用NSCoding来缓存数据,以便从冷启动中快速加载RSS源。
FeedCache处理以下内容
当您首次加载您的表格视图或集合视图时,FeedCache会加载您的源的第一页。如果第一页与前一次加载时不同,则会清除缓存并替换为新的项目。这处理了删除并确保您手机上的数据不会过时。
定义您的模型
首先,您必须创建您想要查看的任何项目,使其遵循FeedItem协议,这确保它遵循NSCoding并是可散列的。重写isEqual()
很重要,因为FeedCache就是使用这个来确定哪些项目应该被插入或删除。默认情况下isEqual()
比较对象内存地址,但我们想要它比较从属性计算出的哈希值
class TestItem: NSObject, FeedItem{
var name: String? = nil
init(name: String){
self.name = name
}
@objc required init(coder aDecoder: NSCoder){
name = aDecoder.decodeObjectForKey("name") as? String
}
@objc func encodeWithCoder(aCoder: NSCoder){
aCoder.encodeObject(name, forKey: "name")
}
// It's important to override isEqual so it compares properties
override func isEqual(object: AnyObject?) -> Bool {
if let object = object as? TestItem {
return hashValue == object.hashValue
}
return false
}
// Override hashValue to compute a value from the object's properties
override var hashValue : Int{
var h: Int = 0
if let name = name { h ^= name.hash }
return h
}
}
定义您的获取请求
FeedFetchRequest协议要求您实现fetchItems
方法。这是由FeedCache调用的。
struct TestFeedRequest: FeedFetchRequest {
var clearStaleDataOnCompletion: Bool
var pageNumber: Int
var itemsPerPage: Int
init(clearStaleDataOnCompletion: Bool, pageNumber: Int, itemsPerPage: Int){
self.clearStaleDataOnCompletion = clearStaleDataOnCompletion
self.pageNumber = pageNumber
self.itemsPerPage = itemsPerPage
}
func fetchItems(success success: (newItems: [TestItem]) -> (), failure: (NSError) -> ()) {
MockService.fetchItems(pageNumber, itemsPerPage: itemsPerPage, parameters: nil, success: { (newItems) -> () in
success(newItems: newItems)
}) { (error) -> () in
failure(error)
}
}
}
缓存偏好
创建您自己的缓存偏好作为枚举。此示例用于多个源。
enum MyCachePreferences : CachePreferences{
case TestItems
case Friends
case Photos
case PhotosNoCache
var cacheOn: Bool {
switch self {
case .TestItems
return true
case .Friends:
return true
case Photos:
return true
default:
return false
}
}
var cacheName: String {
switch self {
case .TestItem
return "TestItems"
case .Friends:
return "Friends"
case .Photos:
return "Photos"
default:
return ""
}
}
}
创建一个FeedController
现在创建一个在您的UITableViewViewController或UICollectionViewController中的FeedController
,指定它将处理的项目类型。
class MyTableViewController: UITableViewController, FeedControllerDelegate {
var feedController: FeedController<PeopleFeedItem>!
var items = [TestItem]()
override func viewDidLoad() {
feedController = FeedController<PeopleFeedItem>(cachePreferences: MyCachePreferences.TestItems, section: 0)
feedController.delegate = self
feedController.loadCacheSynchronously()
//Defensively copy items to prevent race conditions
items = feedController.items
self.currentPage = 1
let request = PeopleFeedRequest(currentPage, clearStaleDataOnCompletion: true, count: itemsPerPage)
feedController.fetchItems(request)
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
let item = items[indexPath.row]
cell.textLabel?.text = item.name
if indexPath.row == (itemsPerPage * currentPage) - 1 {
loadMoreItems()
}
return cell
}
func loadMoreItems() {
currentPage++
let request = PeopleFeedRequest(currentPage, clearStaleDataOnCompletion: false, count: itemsPerPage)
feedController?.fetchItems(request)
}
//MARK: ***** FeedControllerDelegate Methods *****
func feedController(feedController: FeedControllerGeneric, itemsCopy: [AnyObject], itemsAdded: [NSIndexPath], itemsDeleted: [NSIndexPath]) {
//Defensively copy items to prevent race conditions
items = itemsCopy
tableView.beginUpdates()
tableView.insertRowsAtIndexPaths(itemsAdded, withRowAnimation: UITableViewRowAnimation.Automatic)
tableView.deleteRowsAtIndexPaths(itemsDeleted, withRowAnimation: UITableViewRowAnimation.Automatic)
tableView.endUpdates()
}
}
您可以使用Cocoapods通过将其添加到您的Podfile
中安装FeedCache
platform :ios, '8.0'
use_frameworks!
target 'MyApp' do
pod 'FeedCache'
end