FeedCache 1.1.1

FeedCache 1.1.1

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2017年3月
SwiftSwift 版本3.0
SPM支持 SPM

Rob Seward维护。



FeedCache 1.1.1

FeedCache

用于在iOS中消费和显示RSS源的应用程序框架

FeedCache是CoreData管理分页RSS源数据的替代品。在架构上,它取代了NSFetchedResultsController,同时使用NSCoding来缓存数据,以便从冷启动中快速加载RSS源。

特性

FeedCache处理以下内容

  • 插入
  • 删除(通过第一页缓存删除)
  • 缓存

pull to refresh

第一页缓存删除

当您首次加载您的表格视图或集合视图时,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