一种tableView的架构模式

以下是一种tableView 的架构模式(思路最重要, 代码只有一部分)

// -  UITableView 的类别, 有个 manager 属性
@interface UITableView (Manager)
@property (nonatomic, strong) LGTableManager *manager;
@end

// - UITableView 的类别的实现, 此时 当设置完 manager 之后, 会调用 manager 的 bindToTableView:方法
- (void)setManager:(LGTableManager *)manager{
    [manager bindToTableView:self];
    objc_setAssociatedObject(self, &AssociateKey, manager, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end

// -  LGTableDelegateHandler 用于处理 tableview 的delegate 和 dataSource 的事件的回调(通过tableManager 拿到所有的 section 数据)
@interface LGTableDelegateHandler : NSObject<UITableViewDelegate,UITableViewDataSource>
@property (nonatomic, weak) LGTableManager *tableManager;
@end

// -  LGTableManager 的初始化方法(保存handler, 设置handler.tableManager = self)
@implementation LGTableManager
- (id)initWithSections:(NSArray<id<LGSectionProtocol>> *)sections delegateHandler:(LGTableDelegateHandler *)handler{
    self = [super init];
    if (self) {
        //保存数据源
        _sections = sections;
        //设置代理
        _delegateHandler = handler;
        _preloader = [[LGTablePreloader alloc] init];
        _delegateHandler.tableManager = self;
    }
    return self;
}

// - 设置 tableview 的 manager 时候, 在 setter 中调用的方法;设置代理为 delegateHandler
- (void)bindToTableView:(UITableView *)tableView{
    tableView.delegate = self.delegateHandler;
    tableView.dataSource = self.delegateHandler;
    self.tableView = tableView;
}

// - 观察 runloop 的状态,  当 runloop 不忙时候, 去执行任务
static void reigsterObserver(id self){
    CFRunLoopRef runLoop = [NSRunLoop mainRunLoop].getCFRunLoop;
    CFRunLoopActivity activities = kCFRunLoopBeforeWaiting | kCFRunLoopExit;
    observer = CFRunLoopObserverCreateWithHandler(kCFAllocatorDefault,
                                                  activities,
                                                  YES, NSUIntegerMax, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
                                                      [self executeTask];
                                                  });
    LGTaskDispatch *dispatcher = (LGTaskDispatch *)self;
    CFRunLoopMode mode = (dispatcher.excuteMode == LGTaskModeDefault ? kCFRunLoopDefaultMode : kCFRunLoopCommonModes);
    CFRunLoopAddObserver(runLoop, observer, mode);
    dispatcher.state = LGTaskStateRunning;
}

项目下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值