0%

引入JS文件

在default.hbs中引入js文件,下载TOC

//放在jQuery之后
<script src="https://xxxxxx.com/jquery.toc.min.js"></script>

添加DIV

在post.hbs文件的</main>标签之前添加下面代码

<aside id="toc">
    <h4>文章目录</h4>
</aside>

设置样式

在博客的css文件里设置样式,代码如下:

#toc {
    font: 400 16px/1.8 "Open Sans","Hiragino Sans GB","Microsoft YaHei","WenQuanYi Micro Hei",sans-serif;
    position: fixed;
    display: none;
    left:50%;
    top: 50%;
    width: 180px;
    max-height: 100%;
    padding: 0 5px;
    overflow-y: auto;
}
#toc ol {
    margin: 0 0 0 1em;
    list-style: none;
    padding: 0;
}
#toc li {
    padding: 0;
    position: relative;
}
#toc li:before {
    border: 5px dashed transparent;
    border-left: 5px solid #57a3e8;
    position: absolute;
    left: -1em;
    top: .5em;
}
#toc li:before {
    content: "";
    height: 0;
    width: 0;
    overflow: hidden;
}
#toc a {
    display: block;
    color: #6aa7c0;
    cursor: pointer;
    max-height: 2em;
    white-space: nowrap;
    text-overflow: ellipsis;
    overflow: hidden;
    text-decoration: none;
    transition: color .3s;
}
#toc a:hover {
    color: #F3A01E;
}
#toc h4 {
    padding-bottom: 0.25em;
    margin: .75em 0;
    border-bottom: 1px solid #b3b3b3;
    font-size: 18px;
    color: #3b3b3b;
    font-family: "Open Sans","Hiragino Sans GB","Microsoft YaHei","WenQuanYi Micro Hei",sans-serif;
}

初始化目录插件并动态的调整样式

在博客下的JS文件中添加下面代码:

$(document).ready(function() {
    //初始化插件
    $('#toc').initTOC({
        selector: "h5, h6",
        scope: "article",
        overwrite: false,
        prefix: "toc"
    });

    //动态设置样式,例如:滚动到一定程度之后隐藏目录
    var mar_left = $(".post").width() / 2 + 20;
    //var top = $("#toc").css("top"); 这只能获取类似152px的字符串,下面才能获取值
    //var top = $("#toc").position().top;
    var top = $(window).height();
    $("#toc").css("top",top / 2 - (top / 4)+"px");
    $("#toc ol").html(function(i,origText){
        return origText + "<li><a id='scrollTop' href='#'>返回顶部</a></li>";
    });
    $("#toc").css({"margin-left":mar_left+"px"});
    $(window).scroll(function(){
        var window_offset = $(window).scrollTop();
        var main_header_height = $(".main-header").height();
        var content_height = $(".content").height();
        if(window_offset < main_header_height - 100) {
            $("#toc").hide();
            //下面的条件不能用 a>x>c这种形式,只能用&&.身为一个前端小白表示伤不起...
        }else if(window_offset > main_header_height&&main_header_height+content_height - 500 > window_offset) {
            $("#toc").show();
        }else{
            $("#toc").hide();
        }
    });
});

以上就是我博客的文章目录添加步骤.前端有个好处就是所见即所得,慢慢折腾.^_^

–EOF–

#import <Foundation/Foundation.h>

@interface Tom : NSObject
@property (nonatomic,copy) NSString *name;
@property (nonatomic) NSInteger age;
@end

@implementation Tom
- (instancetype)initWithName:(NSString *)name andAge:(NSInteger)age {
    if (self = [self init]) {
        self.name = name;
        self.age =age;
    }
    return self;
}
@end

@interface Jerry : NSObject
@property (nonatomic) NSString *name;
@property (nonatomic) NSInteger age;
@end

@implementation Jerry
- (instancetype)initWithName:(NSString *)name andAge:(NSInteger)age {
    if (self = [self init]) {
        self.name = name;
        self.age =age;
    }
    return self;
}
@end

@interface Test : NSObject
@end

@implementation Test
+ (void)showName:(Tom *)tom {
    NSLog(@"%@",tom.name);
}
+ (void)showNameWithKVC:(NSObject *)obj{
    NSString *name = [obj valueForKey:@"name"];
    NSLog(@"%@",name);
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Tom *tom = [[Tom alloc]initWithName:@"Tom" andAge:10];
        Jerry *jerry = [[Jerry alloc]initWithName:@"Jerry" andAge:10];
        
        //可以通过强转的方式
        [Test showName:(Tom *)jerry];
        [Test showName:tom];
        
        //也可以通过KVC
        [Test showNameWithKVC:jerry];
        [Test showNameWithKVC:tom];
        
    }
    return 0;
}

–EOF–

用密码登录SSH好不方便,并且安全性不高,为了提升安全性那我们就用密钥登录.

本地环境:OS X,估计是Linux就可以.

1.在远程服务器上创建密钥对.

# create key pair

[cent@dlp ~]$ ssh-keygen -t rsa -c "邮箱"

Generating public/private rsa key pair.
Enter file in which to save the key (/home/cent/.ssh/id_rsa): # 路径默认,直接回车

Created directory '/home/cent/.ssh'.
Enter passphrase (empty for no passphrase): # 设置密钥密码,直接回车,不用设置

Enter same passphrase again:#再次输入密码,直接回车

Your identification has been saved in /home/cent/.ssh/id_rsa.
Your public key has been saved in /home/cent/.ssh/id_rsa.pub.
The key fingerprint is:
38:f1:a4:6d:d3:0e:99:c8:fa:1d:1d:48:86:f0:fe:74 cent@dlp.server.world
The key's randomart image is:

[cent@dlp ~]$ mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys#将id_rsa.pub中的公钥复制到authorized_keys中

[cent@dlp ~]$ chmod 600 ~/.ssh/authorized_keys #修改authorized_keys权限为拥有者可读写

2.将远程服务器上的私钥下载到本地用于登录远程服务器

以下是本地操作

 [cent@www ~]$ mkdir ~/.ssh #创建文件夹

[cent@www ~]$ chmod 700 ~/.ssh #修改文件夹权限为拥有者可'读,写,执行'
# copy the secret key to local ssh directory

[cent@www ~]$ scp cent@10.0.0.30:/home/cent/.ssh/id_rsa ~/.ssh/ #将远程的私钥下载到本地,这要注意路径,如果用root登录的,路径是:/root/.ssh/id_rsa

cent@10.0.0.30's password: #输入远程服务器密码
id_rsa
[cent@www ~]$ ssh -i ~/.ssh/id_rsa cent@10.0.0.30 #现在就可以用这条命令登录远程服务器了

Enter passphrase for key '/home/cent/.ssh/id_rsa': # 刚才密钥没设置密码,所以不会出现

Last login: Wed Jul 30 21:37:19 2014 from www.server.world
[cent@dlp ~]$ # 登录成功

3.简化登录

本地机器执行下面代码:

vi ~/.ssh/config

加入下面一段内容:

Host server #别名,域名缩写
    HostName jingxuetao.com #完整的域名
    User root #登录该域名使用的账号名
    PreferredAuthentications publickey #加不加都一样,SSH会优先密钥登录
    IdentityFile ~/.ssh/id_rsa #私钥文件的路径
    #删掉#号后面的中文,包括这句

上面配置完了之后就可以通过ssh server或者ssh jingxuetao.com来登录远程服务器了.

4.关闭密码验证登录

操作远程服务器

vi /etc/ssh/sshd_config

找到PasswordAuthentication将其值改为no

PasswordAuthentication no

最后用systemctl restart sshd或者service sshd restart重启SSH服务

好了,sshd_config文件中除了配置PasswordAuthentication这条之外其他的并不用配置,还是被注释状态

保存到本地的密钥,最好备份到网盘一份.

本文参考:server-world

–EOF–

前一天过得不踏实,心里不安,胡思乱想中想起博客名,就想起了高中,然后又想起了初中.然后百度了一下初中跟高中的官网,于是就找了一些图片,回忆一下我的初中跟高中.多图预警

平度市朝(zhao)阳中学

教学楼正面,教学楼从上面看是呈一个蝴蝶状的.初三的时候做课间操就是在教学楼前的广场上做.我们班在做操的时候是在广场中央,因为喇叭是安装在两边的教学楼上的并且对称,所以在做操的时候会有不一样的听觉效果.第一张图片是当时我们的朝阳中学的原图,下面三张图是后来的华侨高中.因为乡镇高中要迁往市里,所以就把我们学校给征收了,变成了华侨高中.好好的母校,被别人征去当高中,真是亏.




教学楼背面.由于花钱不太节制,家里给的生活费第一个周花的差不多了,到了第二个周就只剩二三十块钱左右,二三十块钱要过五天,平均每天也就五六块钱.所以每当中午放学的时候,听着喇叭里放的斯卡波罗集市,走在这条回宿舍的路上(没钱,只能回宿舍,就着调料啃馒头:(),心里有点淡淡的忧伤.歌曲如下:

<斯卡波罗集市-莎拉布莱曼>

操场,应该是初二的时候修起来的.之前都叫草场,杂草丛生,草有人那么高.

左边是一个小操场,初二的时候做广播体操,早晨跑操都在这.右边是女生宿舍,当时好像没窗帘..

餐厅拐角处的一棵树.树的右边是一个大花坛(图中没有),想当年’老邱’(学生处主任,武警出身)在这整过两个带刀外校学生.

教学楼,宿舍楼东边的一条路,灯是后来装的

对了,我们那一级是16个班,然而其他初中就算全校也没有16个班啊有木有,所以我们会说’拉我们一个级部出去可以打其他学校的整个学校’.不过后来招的学生就慢慢变少了,我们下一级好像是14个班.这几年好像8个班…

平度市开发区高中

高中跟初中比起来就比较老旧了,因为初中是06年刚搬到新校区.而高中一直是这个校区.然而一中,九中都换了新校区,并且其他几所高中由于跟一中九中合并,同样也是新校区,就我们学校.万恶的资本主义,唉.

仁卿楼,主教学楼,楼前一本大书,内容是劝学(劝学是个什么鬼,劝你退学,恩!),左边是中文版,右边是英文版


仁卿楼广场西边,餐厅南边的小花坛,再往西是高二西教学楼

高二西教学楼前的草坪,想起了被班主任没收的手机…

高二西教学楼前的走廊

仁卿楼广场西面的办公楼,高三临近毕业的时候正式入团(共青团)就是在这弄得^_^,少交了好几年团费,不亏.

高中官网上的图片差不多就这些了,大一的时候高中又重修了一座教学楼跟操场,说好的重建校区呢??看来重建校区是没希望了..

有时间一定回去看看,但是什么时候有时间呢?这是个问题.

好了,矫情完毕,睡觉.

–EOF–

HTTP严格传输安全(英语:HTTP Strict Transport Security,缩写:HSTS)是一套由互联网工程任务组发布的互联网安全策略机制。网站可以选择使用HSTS策略,来让浏览器强制使用HTTPS与网站进行通信,以减少会话劫持风险.

内容

HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接。服务器开启HSTS的方法是,当客户端通过HTTPS发出请求时,在服务器返回的超文本传输协议响应头中包含Strict-Transport-Security字段。非加密传输时设置的HSTS字段无效。

比如,https://example.com/ 的响应头含有Strict-Transport-Security: max-age=31536000; includeSubDomains。这意味着两点:

  1. 在接下来的一年(即31536000秒)中,浏览器只要向example.com或其子域名发送HTTP请求时,必须采用HTTPS来发起连接。比如,用户点击超链接或在地址栏输入http://www.example.com/ ,浏览器应当自动将 http 转写成 https,然后直接向 https://www.example.com/ 发送请求。
  2. 在接下来的一年中,如果 example.com 服务器发送的TLS证书无效,用户不能忽略浏览器警告继续访问网站.

历史

HSTS的雏形来自于2008年4月在北京召开的第十七届国际万维网大会上柯林·杰克逊(Collin Jackson)和亚当·巴斯(Adam Barth)的题为“ForceHTTPS: Protecting High-Security Web Sites from Network Attacks”的演讲。他们的提议是使用“ForceHTTPS” Cookie来强制浏览器使用HTTPS。

2009年9月18日,他们和杰夫·霍奇斯(Jeff Hodges)发布了最初的草案,题目为”Strict Transport Security”[5],这个草案基于ForceHTTPS,并有所修改。

2010年6月17日,这三位作者经由互联网工程任务组发布了首版互联网草案,”HTTP Strict Transport Security”。

2012年10月2日,互联网工程指导组批准了将第14版HSTS草案发布为RFC的请求。

2012年11月19日,互联网工程任务组发布RFC 6797

作用

HSTS可以用来抵御SSL剥离攻击。SSL剥离攻击是中间人攻击的一种,由Moxie Marlinspike于2009年发明。他在当年的黑帽大会上发表的题为“New Tricks For Defeating SSL In Practice”的演讲中将这种攻击方式公开。SSL剥离的实施方法是阻止浏览器与服务器创建HTTPS连接。它的前提是用户很少直接在地址栏输入 https:// ,用户总是通过点击链接或3xx重定向,从HTTP页面进入HTTPS页面。所以攻击者可以在用户访问HTTP页面时替换所有 https:// 开头的链接为 http:// ,达到阻止HTTPS的目的.

HSTS可以很大程度上解决SSL剥离攻击,因为只要浏览器曾经与服务器创建过一次安全连接,之后浏览器会强制使用HTTPS,即使链接被换成了HTTP。

另外,如果中间人使用自己的自签名证书来进行攻击,浏览器会给出警告,但是许多用户会忽略警告。HSTS解决了这一问题,一旦服务器发送了HSTS字段,用户将不再允许忽略警告。

不足

用户首次访问某网站是不受HSTS保护的。这是因为首次访问时,浏览器还未收到HSTS,所以仍有可能通过明文HTTP来访问。解决这个不足目前有两种方案,一是浏览器预置HSTS域名列表,Google Chrome、Firefox、Internet Explorer和Microsoft Edge实现了这一方案。二是将HSTS信息加入到域名系统记录中。但这需要保证DNS的安全性,也就是需要部署域名系统安全扩展。截至2014年这一方案没有大规模部署。

由于HSTS会在一定时间后失效(有效期由max-age指定),所以浏览器是否强制HSTS策略取决于当前系统时间。部分操作系统经常通过网络时间协议更新系统时间,如Ubuntu每次连接网络时,OS X Lion每隔9分钟会自动连接时间服务器。攻击者可以通过伪造NTP信息,设置错误时间来绕过HSTS。解决方法是认证NTP信息,或者禁止NTP大幅度增减时间。比如Windows 8每7天更新一次时间,并且要求每次NTP设置的时间与当前时间不得超过15小时。

浏览器支持

  • Chromium和Google Chrome从4.0.211.0版本开始支持HSTS
  • Firefox 4及以上版本
  • Opera 12及以上版本
  • Safari从OS X Mavericks起
  • Internet Explorer从Windows 10技术预览版开始支持

网站支持

根据SSL Pulse的调查,截至2015年2月,仅有2.7%的网站开启了HSTS。目前支持HSTS的主流网站有:支付宝、PayPal、Twitter、维基百科邮件列表、上善若水等。

以上内容来自维基百科,维基百科真是个好网站.

配置

啰嗦了这么多,其实就是为了凑字数.Nginx配置在ssl.conf文件中的server字段下添加如下代码:

add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";//第二个跟第三个参数一般来说没用,支付宝的首页就只用了第一个参数.所以添加下面一行配置就行
add_header Strict-Transport-Security "max-age=31536000;";

max-age ,单位是秒,用来告诉浏览器在指定时间内,这个网站必须通过 HTTPS 协议来访问。也就是对于这个网站的 HTTP 地址,浏览器需要先在本地替换为 HTTPS 之后再发送请求。

includeSubDomains ,可选参数,如果指定这个参数,表明这个网站所有子域名也必须通过 HTTPS 协议来访问。

preload ,将域名加入HSTS Preload List,但是有这个参数也不一定能加入.

HSTS 这个响应头只能用于 HTTPS 响应;网站必须使用默认的 443 端口;必须使用域名,不能是 IP。而且启用 HSTS 之后,一旦网站证书错误,用户无法选择忽略。

配置生效

最后打开 chrome://net-internals/#hsts ,在Query domain中输入自己的域名(不加http),搜索一下试试.往后,只要用户不清缓存,就会直接通过https://xxxx.com:443 访问网站,而不是通过http重定向到https的方式了.

–EOF–

1.前期准备

yum update //更新yum源
yum groupinstall "Development Tools" //安装开发工具包
yum install wget //安装wget下载工具

2.安装Nginx

yum install nginx -y //安装nginx
service nginx start //开启nginx
chkconfig nginx on //设置开机自启动

Nginx安装完成,现在用IP或者域名就可以访问你的服务器了.

使用Nginx配置反向代理,指向ghost博客的2368端口.

cd /etc/nginx/conf.d //cd到nginx目录
vim default.conf //打开default.conf文件

在文件中写入一下内容:

server {  
    listen 80;
    server_name jingxuetao.com;
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:2368;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

将上面的server_name 替换成自己的域名,保存退出,并重启Nginx.

service nginx restart

3.安装MySQL

Ghost集成了sqlite3数据库,如果不用MySQL,本步可以忽略.

yum install mysql mysql-server //安装MySQL
service mysqld restart //启动数据库
chkconfig mysqld on //设置开机启动
mysql_secure_installation //开始配置数据库
Set root password? [Y/n] //设置root密码 -- 根据个人需求  
anonymous users? [Y/n] //删除匿名用户 -- y  
Disallow root login remotely? [Y/n] //禁止root用户远程登录 --n
Remove test database and access to it? [Y/n] //删除默认的 test 数据库 --y  
Reload privilege tables now? [Y/n] //是否马上应用最新的设置 --y  

为了支持中文,还需要修改MySQL字符支持.

 vim /etc/my.cnf

在对应位置填入对应的内容:

[client]
default-character-set=utf8  
[mysql]
default-character-set=utf8  
[mysqld]
character-set-server=utf8  
collation-server=utf8_general_ci  

然后新建一个Ghost专用MySQL用户跟database:

mysql -u root -p  
//用root用户登录mysql

create database ghost;  
//创建ghost数据库

GRANT ALL PRIVILEGES ON ghost.* To 'ghost'@'%' IDENTIFIED BY '密码';  
//创建ghost database 和 用户名为ghost的用户
//%代表能被所有地址访问

4.安装Node.js

根据Ghost官方建议,安装v0.10.40版本

wget http://nodejs.org/dist/v0.10.40/node-v0.10.40.tar.gz
tar zxvf node-v0.10.40.tar.gz
cd node-v0.10.40
./configure
make && make install

5.安装Ghost

mkdir /var/www //创建Ghost安装路径
wget http://dl.ghostchina.com/Ghost-0.7.4-zh-full.zip //下载Ghost(中文版)
unzip Ghost-0.7.4-zh-full.zip //解压zip文件到当前文件夹
mv config.example.js config.js //重命名,并配置
vim config.js //打开config.js文件,并在里面填写对应内容.如果用sqlite3,只需要配置url
production: {  
    url: 'http://jingxuetao.com', //这里是你自己VPS主机的域名,或者IP
    mail: {},
    database: {
        client: 'mysql'这里我选择使用mysql作为我博客的数据库
        connection: {
            host : '127.0.0.1',
            user : 'ghost', //mysql用户名
            password : '', //密码
            database : 'ghost', //之前创建的ghost数据库名称
            charset : 'utf8'
        },
    server: {
            host: '127.0.0.1',
            port: '2368'//若修改该端口记得在nginx中做相应改变
        }
    }  

现在在www目录下用命令npm start启动Ghost,网页就可以浏览了.

6.使用PM2让Ghost永远在线

只要我们一断开ssh,Ghost的进程就会被关闭,这里我们使用PM2来守护Ghost服务进程,并让其运行在生产模式production上

//!!首先进到ghost的安装目录
//安装pm2
npm install pm2 -g  
//让ghost以production模式运作,指定程序的入口index.js,并且此进程命名为ghost
NODE_ENV=production pm2 start index.js --name "ghost"  
//开机启动
pm2 startup centos  
pm2 save  

进程守护做完,顺便提提pm2重启进程的命令是:

pm2 restart ghost

http://jingxuetao.com/ghost 访问后台

7.设置外部存储

Ghost默认是将图片存储在服务器上的,但是服务器存储空间有限,并且外部存储又不花钱.

https://portal.qiniu.com/ 创建七牛云存储账号,并创建一个空间(公开空间).(使用免费空间之前得冲10块钱),然后修改Ghost配置文件如下:

       /*storage: {
            provider: 'local-file-store'
        }*/ //注释掉本地存储代码.
        storage: {
            provider: 'qiniu',
            bucketname: 'blog-pic',//空间名称
            ACCESS_KEY: 'd05f31DxWMuCdnqxxxxHOFc5cMJ4rQbdpnPJGB4F',//账号->密钥(左边菜单栏),将AK,SK分别对应ACCESS_KEY,SECRET_KEY填入
            SECRET_KEY: 'q6l8YgfxOdxGSR8U5_DwBhtyC5133xurgBGyjIHt',
            root: '/image/',
            prefix: 'http://o3pxzuakz.qnssl.com'//选择一个空间->空间设置->域名设置->七牛域名,将网址复制到这.
        }

然后,在default.conf文件的location中添加

client_max_body_size 5m; //设置上传图片最大是5M,不设置上传图片会不成功,默认上传图片大小比较小.

重启Ghost,上传一张图片试试,看看图片地址.

8.设置HTTPS

①申请沃通免费证书,参考这篇文章.
Wosign沃通免费SSL申请开通

②选择nginx的证书,改名为cert.crt跟cert.key

③将证书上传到服务器的/etc/nginx目录下,然后配置Nginx.在/etc/nginx/conf.d目录下,除了default.conf文件之外,应该还有一个sslxxxxx.conf文件(没有就创建ssl.conf文件),将下面内容对比填入或者复制进去.

# HTTPS server
#
server {
    listen 443 ssl;
    server_name jingxuetao.com;

    ssl_certificate /etc/nginx/cert.crt;
    ssl_certificate_key /etc/nginx/cert.key;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout 5m;

    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://127.0.0.1:2368;
        client_max_body_size 5m;
    }
}

另外还得在config.js文件中将url字段http后面加个s,例如:

url: 'https://jingxuetao.com'

现在通过https://jingxuetao.com 就可以访问自己的网站了.

要想将HTTP请求自动跳转到HTTPS,在default.conf文件的location中添加下面内容

return 301 https://$server_name$request_uri;

现在是实现HTTPS了,但是因为网页中含有其他网站的资源文件(图片,一个是头像,另一个就是后台左上角的那个小图标,再就是自己上传到七牛的图片.),所以现在浏览器地址栏中并没有显示安全连接.

–EOF–

一.IOS隐藏tabBar的方法:

self.tabBarController.tabBar.hidden = YES;

但是我们跳转隐藏tabBar需要的不是这段代码.

二.push跳转隐藏tabBar

如果在push跳转时需要隐藏tabBar,设置self.hidesBottomBarWhenPushed=YES;并在push后设置self.hidesBottomBarWhenPushed=NO;这样back回来的时候,tabBar会恢复正常显示。代码如下:

    NextViewController *next=[[NextViewController alloc]init];
    next. hidesBottomBarWhenPushed = YES;
    [self.navigationController pushViewController:next animated:YES];

END

“哈哈,我终于从镜像文件变成变成操作系统啦,O(∩_∩)O~,我的主人每天都会用我办公超过10个小时.虽然我的身体素质不好,但是我有一颗顽强灵魂;虽然每天都会很累,但是我很开心.因为我是主人的操作系统呀!(^__^)”.
_______________________________________________________________—–一台虚拟机的悲哀

或许我们也是虚拟机.
  • 博客从ACE转移到ECS上了.过程比较曲折,结果还算完美.
  • 明天写一下教程,然后再把HTTPS的反代理弄一下.又得翻代码.
  • 以后不折腾了,不折腾了.

END

现在面临的场景

在做项目过程中难免会创建很多ViewModel,这些ViewModel难免有些共同的方法跟属性,这些共同的方法和属性可以单独提取出来,这就用到category.我现在的具体场景是:每个ViewModel都需要请求数据,当ViewController从当前界面切换到另一个画面时,暂停本页面的网络请求.

源码

NSObject+ViewModel.h文件

@interface NSObject (ViewModel)
@property (nonatomic) NSURLSessionDataTask *dataTask;
- (void)cancelTask; //取消任务
- (void)suspendTask; //暂停任务
- (void)resumeTask; //继续任务
@end

NSObject+ViewModel.m文件

#import "NSObject+ViewModel.h"
#import <objc/runtime.h>//得引入runtime

static const void *dataTaskKey = &dataTaskKey;
@implementation NSObject (ViewModel)

//通过运行时, 实现setter方法动态的绑定属性到对象
/**
  参数一 源对象,此处是self
  参数二 唯一静态变量,dataTaskKey保存的是他自己的地址,因为是静态的,所以地址不会重复
  参数三 关联的对象
  参数四 关联策略(属性的内存管理方式),关联策略详细解释在下面
**/
- (void)setDataTask:(NSURLSessionDataTask *)dataTask{
    objc_setAssociatedObject(self, dataTaskKey, dataTask, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

/**
  参数一 源对象,此处是self
  参数二 唯一静态变量,dataTaskKey保存的是他自己的地址,因为是静态的,所以地址不会重复
**/
- (NSURLSessionDataTask *)dataTask{
    return objc_getAssociatedObject(self, dataTaskKey);
}

- (void)resumeTask{
    [self.dataTask resume];
}
- (void)cancelTask{
    [self.dataTask cancel];
}
- (void)suspendTask{
    [self.dataTask suspend];
}
@end

关联策略

&nbsp; &nbsp; &nbsp;Behavior &nbsp; &nbsp;@property Equivalent &nbsp; &nbsp;Description &nbsp; &nbsp; &nbsp; &nbsp;OBJC_ASSOCIATION_ASSIGN &nbsp; &nbsp;@property (assign) 或 @property (unsafe_unretained) &nbsp; &nbsp;指定一个关联对象的弱引用。 &nbsp; &nbsp; &nbsp; &nbsp;OBJC_ASSOCIATION_RETAIN_NONATOMIC &nbsp; &nbsp;@property (nonatomic, strong) &nbsp; &nbsp;指定一个关联对象的强引用,不能被原子化使用。 &nbsp; &nbsp; &nbsp; &nbsp;OBJC_ASSOCIATION_COPY_NONATOMIC &nbsp; &nbsp;@property (nonatomic, copy) &nbsp; &nbsp;指定一个关联对象的copy引用,不能被原子化使用。 &nbsp; &nbsp; &nbsp; &nbsp;OBJC_ASSOCIATION_RETAIN &nbsp; &nbsp;@property (atomic, strong) &nbsp; &nbsp;指定一个关联对象的强引用,能被原子化使用。 &nbsp; &nbsp; &nbsp; &nbsp;OBJC_ASSOCIATION_COPY &nbsp; &nbsp;@property (atomic, copy) &nbsp; &nbsp;指定一个关联对象的copy引用,能被原子化使用。 &nbsp;

这两个方法可以让一个对象和另一个对象关联,就是说一个对象可以保持对另一个对象的引用,并获取那个对象。有了这些,就能实现属性功能了。

END

经过一番折腾,现在博客能通过HTTPS访问了,但是还不完美,主要是图片资源不是通过HTTPS形式访问的.一个是自己上传的图片,这个好解决,修改一下七牛上传的图片地址就行.另一个就是多说的头像,多说的头像不支持HTTPS,这个得通过反代理的形式.不知道ACE支不支持反代理,已经提交了工单.当然自己上传的图片也可以通过反代理的形式.

年轻就是折腾!

END