以下是一种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;
}
项目下载