从ios block底层实现刷是不是可以刷iOS

iOS-MJRefresh框架底层实现原理 - 简书
<div class="fixed-btn note-fixed-download" data-toggle="popover" data-placement="left" data-html="true" data-trigger="hover" data-content=''>
写了10690字,被133人关注,获得了104个喜欢
iOS-MJRefresh框架底层实现原理
这两天研究了一下MJRefresh框架底层实现原理,下面贴出研究结果:
#import "ViewController.h"
#import "MJExtension.h"
#import "AFNetworking.h"
#import "UIView+Frame.h"
#import "TopicItem.h"
@interface ViewController ()
//* 请求管理者
@property (nonatomic, weak) AFHTTPSessionManager *
/** 全部的帖子数据 */
@property (nonatomic, strong) NSMutableArray *
/** 用来加载下一页数据 */
@property (nonatomic, copy) NSString *
/******** 下拉刷新-header ********/
/** 下拉刷新控件 */
@property (nonatomic, weak) UIView *
/** 下拉刷新控件里面的文字 */
@property (nonatomic, weak) UILabel *headerL
/** 是否为"松开立即刷新" */
@property(nonatomic, assign, getter=isWillLoadingNewData) BOOL willLoadingNewD
/** 是否为"正在刷新" */
@property(nonatomic, assign, getter=isLoadingNewData) BOOL loadingNewD
/******** 下拉刷新-header ********/
/******** 上拉刷新-footer ********/
/** 上拉刷新控件 */
@property (nonatomic, weak) UIView *
/** 上拉刷新控件里面的文字 */
@property (nonatomic, weak) UILabel *footerL
/** 是否正在加载更多数据 */
@property(nonatomic, assign, getter=isLoadingMoreData) BOOL loadingMoreD
/******** 上拉刷新-footer ********/
@implementation ViewController
#pragma mark - 懒加载
- (AFHTTPSessionManager *)mgr
if (!_mgr) {
_mgr = [AFHTTPSessionManager manager];
#pragma mark - 初始化
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.contentInset = UIEdgeInsetsMake(61, 0, 0, 0);
// 集成刷新控件
[self setUpRefresh];
[self loadNewTopics];
* 集成刷新控件
- (void)setUpRefresh
// 下拉刷新:加载最新的数据
UIView *header = [[UIView alloc] init];
header.backgroundColor = [UIColor yellowColor];
header.height = 60;
header.width = self.tableView.
header.y = - header.
[self.tableView addSubview:header];
self.header =
UILabel *headerLabel = [[UILabel alloc] init];
headerLabel.text = @"下拉可以刷新";
headerLabel.width = self.tableView.
headerLabel.height = header.
headerLabel.textAlignment = NSTextAlignmentC
[header addSubview:headerLabel];
self.headerLabel = headerL
// 上拉刷新:加载更多的数据
UIView *footer = [[UIView alloc] init];
footer.backgroundColor = [UIColor orangeColor];
footer.height = 35;
footer.hidden = YES;
self.tableView.tableFooterView =
self.footer =
UILabel *footerLabel = [[UILabel alloc] init];
footerLabel.text = @"上拉可以加载更多";
footerLabel.width = self.tableView.
footerLabel.height = footer.
footerLabel.textAlignment = NSTextAlignmentC
[footer addSubview:footerLabel];
self.footerLabel = footerL
#pragma mark - 数据处理
* 加载最新的帖子数据
- (void)loadNewTopics
// 拼接请求参数
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
parameters[@"a"] = @"list";
parameters[@"c"] = @"data";
parameters[@"type"] = @"1";
// 发送请求
[self.mgr GET:@"/api/api_open.php" parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id
_Nullable responseObject) {
// 存储maxtime
self.maxtime = responseObject[@"info"][@"maxtime"];
// 字典数组 -& 模型数组
self.topics = [TopicItem mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];
// 刷新表格
[self.tableView reloadData];
// 结束刷新
self.loadingNewData = NO;
// 恢复顶部的内边距
[UIView animateWithDuration:0.25 animations:^{
UIEdgeInsets inset = self.tableView.contentI
inset.top -= self.header.
self.tableView.contentInset =
// 有数据了
self.footer.hidden = NO;
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"请求失败 - %@", error);
// 结束刷新
self.loadingNewData = NO;
// 恢复顶部的内边距
[UIView animateWithDuration:0.25 animations:^{
UIEdgeInsets inset = self.tableView.contentI
inset.top -= self.header.
self.tableView.contentInset =
* 加载更多的帖子数据
- (void)loadMoreTopics
// 拼接请求参数
NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
parameters[@"a"] = @"list";
parameters[@"c"] = @"data";
parameters[@"type"] = @"1";
parameters[@"maxtime"] = self.
// 发送请求
[self.mgr GET:@"/api/api_open.php" parameters:parameters success:^(NSURLSessionDataTask * _Nonnull task, id
_Nullable responseObject) {
// 存储maxtime
self.maxtime = responseObject[@"info"][@"maxtime"];
// 字典数组 -& 模型数组
NSArray *moreTopics = [TopicItem mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];
[self.topics addObjectsFromArray:moreTopics];
// 刷新表格
[self.tableView reloadData];
// 结束刷新
self.loadingMoreData = NO;
self.footerLabel.text = @"上拉可以加载更多";
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"请求失败 - %@", error);
// 结束刷新
self.loadingMoreData = NO;
self.footerLabel.text = @"上拉可以加载更多";
#pragma mark - 代理方法
* 当scrollView在滚动,就会调用这个代理方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
// 处理下拉刷新
[self dealLoadNewData];
// 处理上拉加载更多
[self dealLoadMoreData];
* 当用户手松开(停止拖拽),就会调用这个代理方法
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
if (self.willLoadingNewData == NO || self.loadingNewData)
// 增加顶部的内边距
[UIView animateWithDuration:0.25 animations:^{
UIEdgeInsets inset = self.tableView.contentI
inset.top += self.header.
self.tableView.contentInset =
// 修改文字
self.headerLabel.text = @"正在刷新数据...";
// 正在刷新
self.loadingNewData = YES;
// 发送请求
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self loadNewTopics];
* 处理下拉刷新
- (void)dealLoadNewData
if (self.loadingNewData)
CGFloat offsetY =
- (64 + self.header.height);
if (self.tableView.contentOffset.y &= offsetY) {
self.headerLabel.text = @"松开立即刷新";
self.willLoadingNewData = YES;
self.headerLabel.text = @"下拉可以刷新";
self.willLoadingNewData = NO;
* 处理上拉加载更多
- (void)dealLoadMoreData
// 如果没有数据 或者 正在上拉刷新, 直接返回
if (self.topics.count == 0 || self.loadingMoreData)
CGFloat offsetY = self.tableView.contentSize.height + self.tableView.contentInset.bottom - self.tableView.
if (self.tableView.contentOffset.y &= offsetY) {
self.loadingMoreData = YES;
// 更改文字
self.footerLabel.text = @"正在加载更多的数据...";
// 加载更多的帖子数据
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self loadMoreTopics];
#pragma mark - 数据源
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return self.topics.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *ID = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
TopicItem *item = self.topics[indexPath.row];
cell.textLabel.text = item.
cell.detailTextLabel.text = item.
在tableView上加上一个View,注意不是headerView,而是一个Y值为负数的普通View,下拉时候监听偏移量,改变View的内容显示。在tableView下面加上一个footerView,监听偏移量,当footerView完全显示的时候加载更多数据。基本代码已贴,有不清楚的可以讨论交流。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
· 187人关注
个人iOS技术资料整合.
好好学习天天向上!
· 54人关注
性能优化、封装优化等
· 10人关注
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
选择支付方式:您的举报已经提交成功,我们将尽快处理,谢谢!
可以到机锋论坛或者安智论坛找找教程的,按照步骤来刷机的
1、第一步使手机关机;2、在关机状态下,按住音量上键不放手,然后按电源键开机,手机会进入recovery模式;3、此时可以使用音量上、下键移动光标,将光标移到w...
卡刷教程:http://bbs.lephone.cc/thread--1.html
各种版本固件包下载:http://bbs.lephone.c...
刷机也不会删除内置存储器里的文件的 不用刷机 同时按住音量+和电源和Home键进工程模式(recovery) 双清一下重启就行
如果硬件没有问题的话,HD2刷成砖也不怕,这个机子非常强悍,请问楼主你开机的时候屏幕是不是任何显示都没有,没有HTC,没有三色屏?
你试试这个步骤,能不能进入...
大家还关注红米note3全网通,刷cm13之前是不是要刷一个底层?是什么_cm13吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:3,674贴子:
红米note3全网通,刷cm13之前是不是要刷一个底层?是什么
今天刷了cm13,第三方Rec四清后直接卡刷,但是卸载软件会自动重启,是不是刷之前没刷底层?
“健康随e保”可保障儿童41种重大疾病。150元起/年,给孩子45万高额保障。
嗯,我之前也是,要刷底层,刷了之后就没了,而且指纹可用
5.1升60。刷下cm13但的底层好点
不需要 我是直接从miui8开发版刷cm13的 目前没发现任何bug
贴吧热议榜
使用签名档&&
保存至快速回贴后使用快捷导航没有帐号?
只需一步,快速开始
查看: 5121|回复: 100
在线时间502 小时经验值227 最后登录注册时间帖子阅读权限50UID4860626
大学专科, 积分 227, 距离下一级还需 173 积分
该用户从未签到
G币46 最后登录注册时间
马上注册,结交更多机友,下载更多应用,让你轻松玩转手机。
已有帐号?   下载游戏和软件,请【】进入机锋市场!
本帖最后由 choik 于
15:39 编辑
& &&&从11年第一部安卓手机MT15i,中间多了个华为c8810,最后用了好几个月的i9300,到iphone4s,说说自己的感受。
& &&&我的第一部智能手机诺基亚N72,当时感觉上网那叫一个快,上QQ,看网页各种快。直到它用的电池不行了,偶尔重启。后来出了安卓机,苹果。苹果太贵,也不太懂这两个系统的区别,就买了个2000多的索尼爱立信MT15i,那时候索尼还没吞并爱立信。。刚开始用还真不错,但是越用越卡。学会了刷机,各种刷,一天刷N次有时。但是刷完机作用在于什么呢?只不过是删了几个自带应用,改了些应用图标,界面,最多能添个下拉快捷键(当时索尼爱立信机器没下拉快捷键)。后来用了不到一个月的华为c8810,配置跟mt15i差不多一样,也拿来就刷。然后换了i9300,但是i9300刚出不久吧,4.8的屏幕绝对震撼,4核确实比单核快多了。那时候开始学习iOS开发了。我是学计算机的。4.0.4的系统,也开始刷,但不论怎么刷怎么精简优化,应用装了三四页,滑动的时候明显感觉卡,当时真是恼火,4核还这样。后来出了4.1系统,刷后感觉好多了。再来说说三星的屏幕。i9300的像素点觉得看的清清楚楚,颜色太假很假,当时拿同学的4s一比。。。伤心。当root刷机刷多了,其实就知道刷机没什么太大用处,顶多可以用用其他rom还得别人做好的,bug也多,后来就干脆,不刷机了,直接用官方原版。1月换了4s,上手确实感觉用起来没那么随意,主要在于下拉快捷键。然后学会了越狱,然后发现。。。越狱了才是iphone真正好玩的时候,sbsettings,ncsettings,各种手势操作,各种主题,或者手动替换图标,等等。。。流畅性真是安卓没法比的。
& && & 因为自己也是开发人员,可以跟大家讲讲ios跟android一些机制什么的。安卓:1》所有的 APP 都是由 Java 代码编写并在 Dalvik VM 中得到解释执行。在 Android 操作系统中,每个 Dalvik VM 的每个 Instance 都对应于 Linux 内核中的一个进程。Android 设计使得每个应用程序由一个独立的 Dalvik 实例解释执行,而每个 Linux 内核进程加载一个 Dalvik 实例,通过这种方式提供 app 的运行环境。 就是安卓的app都是运行在一个Dalvik VM中,就是Dalvik虚拟机,大家如果用过虚拟机就会知道虚拟机如果没有一个强大的配置运行效率很低的。2》然后安卓的内存管理呢,因为java有垃圾回收,当系统内存不足时,系统将激活内存回收过程。实际使用起来的话,你如果要开启一个大型游戏,如果你事先不先手动清理一下内存,会很卡,这点做得不太好。3》从开发代码来说吧,安卓用的java,java是简单跨平台,易用,但是这样带来的后果就是java做出来的东西运行效率低下。C&OC&=C++&...&java。
& && & iphone吧:1》iOS用的是objective-c写的就是OC。2》iOS的应用都是程序员自己管理内存,iOS不存在垃圾回收,当app进入后台时,如果没有要继续执行的话,会不占用CPU,但是还会占用内存,但为什么你再开启其他大型游戏或应用的时候仍不卡呢?因为当你再开启的时候,如果内存吃紧,系统会自动释放掉之前应用占用的内存,任务管理里面仍然会看到之前应用,但它已经不占用内存了。3&苹果的GUI,就是界面,做这个已经很长时间了,安卓在很长一段时间内很难赶上,你如果做过ios开发,iphone模拟器调成慢速动画,会轻易发现iOS的界面动画是多么顺滑完美。4》ios安装应用会给它分配一个随机的沙盒目录,各个应用独立,你不知道哪个目录下面放的什么应用,应用之间不能随便获取数据,安全性。。。
& && & iphone的缺点嘛就是,因为只有他一家做,所以出不了那么多不同种类各种屏幕大小的手机,如果不越狱的话,没有下拉快捷键真的不方便,(其实我现在GPS,蓝牙,定位一直全开的),对了 蓝牙4.0&&包括低耗能技术,ble,蓝牙耗电微乎其微了。还有一点很重的是,iphone的GPS比安卓的定位好太多了。。。不知原因。还有就是状态栏的推送广告,iphone的每个应用你都可以选择不要推送,但是安卓不行,装多了乱七八糟的app,通知栏各种广告烦死人。还得用各种优化大师处理。。。得说说三星的屏幕,P排列真的太烂了。去看过note2,gs4的屏幕,note2的烂透了,gs4的好些,但是还会看到像素点,但是已经很小了。再就是颜色失真,不过amoled的屏幕优点也有,纯黑什么的。。。推荐大家买ips屏幕,视网膜的真心好很多。
& && &说了这么多,大家有个了解。。针对安卓和iphone互喷,我以我用过3个安卓1个iphone来说,我真心觉得iphone更好一些,我以前也像安卓用户一样说过iphone的不是,到现在觉得iphone更胜一筹,咱们是用户,哪个好用哪个,希望安卓的用户有机会可以用几个月的iphone试试。,我现在装了近200个app,16G快满了,但是跟什么都不装速度一模一样,从来不用关机,也不会变卡。当然,安卓在进步,但是由于底层原因,相同配置,肯定iOS或者wp8系统更流畅,这点无容置疑。欢迎大家一起讨论。。
在线时间502 小时经验值227 最后登录注册时间帖子阅读权限50UID4860626
大学专科, 积分 227, 距离下一级还需 173 积分
该用户从未签到
G币46 最后登录注册时间
在线时间502 小时经验值227 最后登录注册时间帖子阅读权限50UID4860626
大学专科, 积分 227, 距离下一级还需 173 积分
该用户从未签到
G币46 最后登录注册时间
莫沉,码字不易
在线时间52 小时经验值250 最后登录注册时间帖子阅读权限50UID
大学专科, 积分 250, 距离下一级还需 150 积分
TA的每日心情开心 11:50签到天数: 2 天[LV.1]初来乍到
G币38 最后登录注册时间
楼主,你打了这么多字,辛苦了。。。。。
赞同楼主的看法,对苹果唯一的不满就是太贵。。。穷人
在线时间502 小时经验值227 最后登录注册时间帖子阅读权限50UID4860626
大学专科, 积分 227, 距离下一级还需 173 积分
该用户从未签到
G币46 最后登录注册时间
ywwh9999 发表于
楼主,你打了这么多字,辛苦了。。。。。
赞同楼主的看法,对苹果唯一的不满就是太贵。。。穷人 ...
希望能从根本认识这两个平台
在线时间2808 小时经验值2808 最后登录注册时间帖子阅读权限100UID545438
博士, 积分 2808, 距离下一级还需 692 积分
TA的每日心情开心 22:22签到天数: 2 天[LV.1]初来乍到
G币904 最后登录注册时间
说那么多必须要支持一下
android玩刷机& &iphone玩游戏
在线时间502 小时经验值227 最后登录注册时间帖子阅读权限50UID4860626
大学专科, 积分 227, 距离下一级还需 173 积分
该用户从未签到
G币46 最后登录注册时间
yobhob 发表于
说那么多必须要支持一下
洗洗睡了。。。。
在线时间25 小时经验值47 最后登录注册时间帖子阅读权限20UID
小学生, 积分 47, 距离下一级还需 3 积分
该用户从未签到
G币3 最后登录注册时间
其实我也想换iphone=-=9300真心刷完机不知道干嘛。最恶心的是拨号和联系人窗口打开各种卡。
在线时间437 小时经验值1701 最后登录注册时间帖子阅读权限90UID6109484
硕士, 积分 1701, 距离下一级还需 799 积分
TA的每日心情开心 15:36签到天数: 13 天[LV.3]偶尔看看II
G币992 最后登录注册时间
IOS注重使用,安卓就是拼硬件
If you stay , I don't need heaven .
在线时间502 小时经验值227 最后登录注册时间帖子阅读权限50UID4860626
大学专科, 积分 227, 距离下一级还需 173 积分
该用户从未签到
G币46 最后登录注册时间
其实我也想换iphone=-=9300真心刷完机不知道干嘛。最恶心的是拨号和联系人窗口打开各种卡。 ...
攒攒钱 发发力,换一个,不后悔。有丰富对比,才能体会差异
Powered by

我要回帖

更多关于 ios底层原理 的文章

 

随机推荐