林峰的小宇宙

🔥爆发了🔥


  • 首页

  • 标签

  • 分类

  • 归档

  • 链接

  • 关于

  • 搜索

股票算法-临界

发表于 2021-08-23 | 分类于 股票算法

包含的算法代码

  1. 涨停倒影,倍量涨停显示下延线,涨停显示-0.5、-1线(同花顺) 涨停显示-1线(通达信)
  2. 临界,显示临界上下沿,显示1、2、3买点
  3. 显示概念、行业、地域
  4. 按均线显示背景颜色(同花顺)
  5. 抄底和逃顶战法

同花顺主图代码

同花顺主图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
IF(ISLASTBAR){
DRAWTEXT_FIX(CURRBARSCOUNT=1,0.05,0.03,0,'概念('+BLOCK(3,0)+')');
DRAWTEXT_FIX(CURRBARSCOUNT=1,0.05,0.06,0,'行业('+BLOCK(0,0)+'》'+
BLOCK(1,0)+') 地域('+BLOCK(2,0)+')');
DRAWTEXT_FIX(CURRBARSCOUNT=1,0.05,0.09,0,ZQMC + '('+ CODE+')');
}
MA5:MA(CLOSE,5),colorwhite,LINETHICK1;
MA11:MA(CLOSE,11),colormagenta,LINETHICK1;
MA36:MA(CLOSE,36),colorligreen,LINETHICK1;
F1:ZIG(3,15),DOTLINE,colorligray;
DRAWTEXT(CROSS(REF(F1,1),F1),1.01*H[1],C[1]),colorred;
DRAWTEXT(CROSS(F1,REF(F1,1)),0.99*L[1],C[1]),colorcyan;
IF(CROSS(REF(F1,1),F1)){
STICKLINE(V>V[1] AND V>V[2],L,L,60,0),colorgreen;
STICKLINE(V[1]>V AND V[1]>V[2],L[1],L[1],60,0),colorgreen;
STICKLINE(V[2]>V AND V[2]>V[1],L[2],L[2],60,0),colorgreen;
} ELSE IF(CROSS(F1,REF(F1,1))){
STICKLINE(V<V[1] AND V<V[2],H,H,60,0),colorred;
STICKLINE(V[1]<V AND V[1]<V[2],H[1],H[1],60,0),colorred;
STICKLINE(V[2]<V AND V[2]<V[1],H[2],H[2],60,0),colorred;
}
涨停:=C>=1.096*C[1];
STICKLINE(涨停,MAX(O,L),MIN(H,C),5,0),coloryellow;
STICKLINE(V>1.9*V[1] AND 涨停,L,L,10,0),colorgreen,LINETHICK1;
STICKLINE(涨停,C[1]*(1-((C-C[1])/2)/C[1]),C[1]*(1-((C-C[1])/2)/C[1]),10,0),colorwhite,LINETHICK1;
STICKLINE(涨停,C[1]*(1-(C-C[1])/C[1]),C[1]*(1-(C-C[1])/C[1]),10,0),colormagenta,LINETHICK1;
涨停n=BARSLAST(涨停,0);
IF(涨停n>0 AND 涨停n<=20){
涨停倒影=C[涨停n+1]*(1-(C[涨停n]-C[涨停n+1])/C[涨停n+1]);
涨停判断=C>C[1] AND C>涨停倒影 AND C[1]<1.05*涨停倒影 AND C[1]>0.97*涨停倒影;
涨停判断2=C>=O AND C>涨停倒影 AND L<1.05*涨停倒影 AND L>0.97*涨停倒影;
涨停判断总=HHV(V,20)=V[涨停n] AND HHV(H,20)<1.07*H[涨停n] AND (涨停判断 OR 涨停判断2);
STICKLINE(涨停判断总,涨停倒影,涨停倒影,20*涨停n,0),coloryellow,LINETHICK2;
DRAWICON(涨停判断总,MIN(0.99*涨停倒影,0.97*L),7);
}
临界:=(CROSS(C,MA36) AND MA11<MA36 AND C>(REF(L,1)+REF(H,1))/2) OR
(L<MA36 AND C>MA36 AND CROSS(MA11,MA36) AND C>(REF(L,1)+REF(H,1))/2);
DRAWGBK(C>=MA11 AND C>=MA36 AND C>=MA5),color007700;
DRAWGBK(C>=MA11 AND C>=MA36 AND C<MA5),color005500;
DRAWGBK(C>=MA11 AND C<MA36 AND MA11<MA36),color666666;
DRAWGBK(C<MA11 AND C>=MA36 AND MA11>=MA36),color550000;
DRAWGBK(临界),colormagenta;
DRAWTEXT(临界,0.99*L,'临界'),colorwhite;
IF(ISLASTBAR){
临界n=BARSLAST(临界,0);
IF(临界n==0){
临界n=BARSLAST(临界,1);
}
STICKLINE(临界n>0,H[临界n],H[临界n],20*临界n,0),colorred,LINETHICK2;
STICKLINE(临界n>0,L[临界n],L[临界n],20*临界n,0),colorgreen,LINETHICK2;
}
均线死叉:=CROSS(MA36,MA11);
均线死叉n:=BARSLAST(均线死叉,0);
临界n=BARSLAST(临界,0);
买点:=C>=MA11 AND C<MA36 AND MA11<MA36 AND CROSS(C,MA11);
IF(买点){
X1:=BARSLAST(买点,1);
试错买点=均线死叉n>X1 OR 临界n<均线死叉n;
DRAWTEXT(试错买点,0.99*L,'①'),colorwhite;
}
二买点=临界n>1 AND CROSS(C,H[临界n]) AND C>MA11;
二买点2=临界n=1 AND L<H[临界n] AND C>H[临界n] AND C>MA11;
DRAWTEXT(二买点 OR 二买点2,100,'②'),colorwhite;
三买点=临界n>1 AND CROSS(C,MA11) AND C>H[临界n] AND C[1]>H[临界n] AND MA11>MA36;
DRAWTEXT(三买点,0.99*L,'③'),colorwhite;

通达信主图代码

通达信主图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
MA5:MA(CLOSE,5),COLORWHITE,LINETHICK1;
MA11:MA(CLOSE,11),COLORMAGENTA,LINETHICK2;
MA36:MA(CLOSE,36),COLORLIGREEN,LINETHICK3;
涨停:=C>=1.096*REF(C,1);
STICKLINE(涨停,MAX(O,L),MIN(H,C),5,0),COLORYELLOW;
临界:=(CROSS(C,MA36) AND MA11<MA36 AND C>(REF(L,1)+REF(H,1))/2) OR
(L<MA36 AND C>MA36 AND CROSS(MA11,MA36) AND C>(REF(L,1)+REF(H,1))/2);
XXX:=BACKSET(ISLASTBAR,BARSLAST(临界)+1);
DDD:=XXX>REF(XXX,1);
STICKLINE(C,REF(H,BARSLAST(DDD))*1.00002,REF(H,BARSLAST(DDD))*0.999998,5,-1),COLORWHITE;
STICKLINE(C,REF(L,BARSLAST(DDD))*1.00002,REF(L,BARSLAST(DDD))*0.999998,5,-1),COLORWHITE;
DRAWTEXT(临界,LOW*0.99,'临界'),COLORYELLOW;
DRAWTEXT_FIX(ISLASTBAR,0,0,0,HYBLOCK);
DRAWTEXT_FIX(ISLASTBAR,0,0.05,0,GNBLOCK);
ZT:=C>=1.096*REF(C,1),NODRAW;
STICKLINE(ZT,O,REF(C,1)*1.1,1,0),COLORYELLOW;
STICKLINE(ZT,REF(C,1)/1.09999,REF(C,1)/1.1,3,1),COLORYELLOW;{涨停倒影划线};
F1:ZIG(3,15),DOTLINE,COLORLIGRAY;
DRAWTEXT(CROSS(REF(F1,1),F1),1.01*REF(H,1),REF(C,1)),COLORRED;
DRAWTEXT(CROSS(F1,REF(F1,1)),0.99*REF(L,1),REF(C,1)),COLORCYAN;
STICKLINE(CROSS(REF(F1,1),F1) AND V>REF(V,1) AND V>REF(V,2),L,L,60,0),COLORGREEN;
STICKLINE(CROSS(REF(F1,1),F1) AND REF(V,1)>V AND REF(V,1)>REF(V,2),REF(L,1),REF(L,1),60,0),COLORGREEN;
STICKLINE(CROSS(REF(F1,1),F1) AND REF(V,2)>V AND REF(V,2)>REF(V,1),REF(L,2),REF(L,2),60,0),COLORGREEN;
STICKLINE(CROSS(F1,REF(F1,1)) AND V<REF(V,1) AND V<REF(V,2),H,H,60,0),COLORRED;
STICKLINE(CROSS(F1,REF(F1,1)) AND REF(V,1)<V AND REF(V,1)<REF(V,2),REF(H,1),REF(H,1),60,0),COLORRED;
STICKLINE(CROSS(F1,REF(F1,1)) AND REF(V,2)<V AND REF(V,2)<REF(V,1),REF(H,2),REF(H,2),60,0),COLORRED;
临界N:=BARSLAST(临界);
均线死叉:=CROSS(MA36,MA11);
均线死叉N:=BARSLAST(均线死叉);
一买点:=C>=MA11 AND C<MA36 AND MA11<MA36 AND CROSS(C,MA11);
DRAWTEXT(一买点,0.995*L,'①'),COLORWHITE;{第二个①开始为实际的一买试错位置}
二买点:=临界N>1 AND CROSS(C,REF(H,临界N)) AND C>MA11 AND NOT(临界N>0 AND 均线死叉N<临界N);
DRAWTEXT(二买点,0.995*L,'②'),COLORWHITE;
三买点:=临界N>1 AND CROSS(C,MA11) AND C>REF(H,临界N) AND REF(C,1)>REF(H,临界N) AND MA11>MA36;
DRAWTEXT(三买点,0.995*L,'③'),COLORWHITE;

股票算法-黄金坑

发表于 2021-08-22 | 分类于 股票算法

包含的算法代码

  1. 均线菱形战法,提示:试错,买点,减仓/补仓,清仓
  2. 黄金坑战法,提示:底背离+均线多头分布
  3. 布林线显示,提示:均线多头排列+突破布林上轨+突破短期震荡平台

同花顺主图代码

同花顺主图

参数 最小 最大 默认
N1 1 50 5
N2 1 100 11
N3 1 150 36
N4 1 50 25
SHORT 1 999 9
LONG 1 999 12
M 1 999 5
N 1 999 2
MM 1 999 10
NN 1 999 5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
MA5:MA(CLOSE,N1),colorwhite,LINETHICK1;
MA11:MA(CLOSE,N2),colormagenta,LINETHICK1;
MA36:MA(CLOSE,N3),colorligreen,LINETHICK1;
FILLRGN(MAX(MA36,MIN(MA11,MA5)),MAX(MA36,MAX(MA11,MA5)),MA5<MA11 AND MA5>MA36,
color005500,MA5<MA11 AND MA11>MA36 AND MA5<MA36,colorgreen);
FILLRGN(MIN(MA5,MIN(MA11,MA36)),MIN(MA36,MA5),MA11<MA36 AND MA5>MA36,colorred,TRUE,color999900);
买点=MA11<MA36 AND MA5>MA36;
DRAWTEXT(买点 AND NOT(买点[1]),0.99*MIN(L,MA11),'买点'),colorred;
清仓点=MA5<MA11 AND MA11>MA36 AND MA5<MA36;
DRAWTEXT(清仓点 AND NOT(清仓点[1]),1.03*MAX(H,MA11),'清仓'),colorgreen;
试错点=MA5>MA11 AND MA5<MA36;
DRAWTEXT(试错点 AND NOT(试错点[1]),0.99*MIN(L,MA11),'试错'),colormagenta;
减仓点=MA5<MA11 AND MA5>MA36;
DRAWTEXT(减仓点 AND NOT(减仓点[1]),1.03*MAX(H,MA11),'减仓'),colorgreen;
加仓点=MA5>MA11 AND MA11>MA36 AND CROSS(MA5,MA11);
DRAWTEXT(加仓点,1.03*MAX(H,MA11),'补仓'),coloryellow;
减仓下=MA11<MA36 AND CROSS(MA11,MA5);
DRAWTEXT(减仓下,0.99*MIN(L,MA11),'减仓'),colorgreen;
//试错点后没有买点需要清仓,减仓点后面有清仓点需要补仓
DIFF:= EMA(CLOSE,SHORT) - EMA(CLOSE,LONG),colorcyan;
DEA:= EMA(DIFF,M),colorwhite;
gj:=MAX(C,O);
L4:=LLV(gj,4);
jl:=(HHV(diff,55)-LLV(diff,55))/5;
gt:=dea>REF(dea,1) AND REF(dea,1)<REF(dea,2);
A1:=BARSLAST(REF(gt,1));
底背离:=REF(L4,A1+1)>CLOSE AND diff>REF(diff,A1+1) AND gt;
DRAWTEXT(底背离,0.99*L,'底背离'),colormagenta;
均线多头分布=MA5>MA11 AND MA11>MA36;
黄金坑=REF(NOT(均线多头分布),1) AND 均线多头分布 AND COUNT(底背离,N4)>0;
DRAWGBK(黄金坑),color000077;
DRAWTEXT(黄金坑,0.99*L,"黄金坑"),colorwhite;
上轨:MA36+2*STD(CLOSE,36),colorred,DOTLINE;
下轨:MA36-2*STD(CLOSE,36),colorgreen,DOTLINE;
//均线多头排列
判断1:=MA5>=MA11 AND MA11>=MA36 AND MA36>=MA(C,200);
//突破布林上轨
判断2:=CROSS(C,上轨);
//突破短期震荡平台
判断3:=C>REF(HHV(H,NN),1) AND ABS(REF(HHV(H,NN),1)-REF(LLV(L,NN),1))/REF(LLV(L,NN),1)<MM/100;
DRAWGBK(判断1 AND 判断2 AND 判断3),coloryellow;
DRAWTEXT(判断1 AND 判断2 AND 判断3,0.99*L,"突破"),colorwhite;

Flutter技术开发入门和一些心得

发表于 2020-05-01 | 分类于 学习笔记

[TOC]

Flutter是什么?

Flutter 是 Google推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。

  • 它开辟了全新的思路,提供了一整套从底层渲染逻辑到上层开发语言的完整解决方案:视图渲染完全闭环在其框架内部,不依赖于底层操作系统提供的任何组件,从根本上保证了视图渲染在 Android 和 iOS 上的高度一致性。
  • Flutter 的开发语言 Dart,是 Google 专门为(大)前端开发量身打造的专属语言,借助于先进的工具链和编译器,成为了少数同时支持 JIT 和 AOT 的语言之一,开发期调试效率高,发布期运行速度快、执行性能好,在代码执行效率上可以媲美原生 App。
  • Flutter提供了丰富的组件、接口,开发者可以很快地为 Flutter添加 native扩展。

Flutter的特性

跨平台自绘引擎

Flutter与用于构建移动应用程序的其它大多数框架不同,因为Flutter既不使用WebView,也不使用操作系统的原生控件。 相反,Flutter使用自己的高性能渲染引擎来绘制widget。这样不仅可以保证在Android和iOS上UI的一致性,而且也可以避免对原生控件依赖而带来的限制及高昂的维护成本。

Flutter使用Skia作为其2D渲染引擎,Skia是Google的一个2D图形处理函数库,包含字型、坐标转换,以及点阵图都有高效能且简洁的表现,Skia是跨平台的,并提供了非常友好的API,目前Google Chrome浏览器和Android均采用Skia作为其绘图引擎。

目前Flutter默认支持iOS、Android、Fuchsia(Google新的自研操作系统)三个移动平台。但Flutter亦可支持Web开发(Flutter for web)和PC开发。

高性能

Flutter高性能主要靠两点来保证,首先,Flutter APP采用Dart语言开发。Dart在 JIT(即时编译)模式下,速度与 JavaScript基本持平。但是 Dart支持 AOT(提前编译),当以 AOT模式运行时,JavaScript便远远追不上了。速度的提升对高帧率下的视图数据计算很有帮助。其次,Flutter使用自己的渲染引擎来绘制UI,布局数据等由Dart语言直接控制,所以在布局过程中不需要像RN那样要在JavaScript和Native之间通信,这在一些滑动和拖动的场景下具有明显优势,因为在滑动和拖动过程往往都会引起布局发生变化,所以JavaScript需要和Native之间不停的同步布局信息,这和在浏览器中要JavaScript频繁操作DOM所带来的问题是相同的,都会带来比较可观的性能开销。

开发效率高

Dart运行时和编译器支持Flutter的两个关键特性的组合:

基于JIT的快速开发周期:Flutter在开发阶段采用,采用JIT模式,这样就避免了每次改动都要进行编译,极大的节省了开发时间;

基于AOT的发布包: Flutter在发布时可以通过AOT生成高效的ARM代码以保证应用性能。而JavaScript则不具有这个能力。

高性能

Flutter旨在提供流畅、高保真的的UI体验。为了实现这一点,Flutter中需要能够在每个动画帧中运行大量的代码。这意味着需要一种既能提供高性能的语言,而不会出现会丢帧的周期性暂停,而Dart支持AOT,在这一点上可以做的比JavaScript更好。
Google作为一个轮子大厂,直接在两个平台上重写了各自的UIKit,对接到平台底层,减少UI层的多层转换,UI性能可以比肩原生,这个优势在滑动和播放动画时尤为明显。

高度一致性

这里的高度一致性不仅仅指各平台 UI 一致,更重要的是各个平台运行的是同一份代码。以前一份需求在 iOS 与 Android 上需要各实现一份,在迭代的时候就会带来额外的协商成本,对于迭代速度很快的我们来说,Flutter可以很好地抹平这个成本。
但是并不是说用了Flutter就不需要原生开发了,原来做业务实现的原生开发者可以更关注与本身系统相关的底层和性能实现。

高可控制性

什么是高可控制性?Flutter 对宿主的依赖很低,宿主提供一个画布就可以自己运行起来,还有渲染流程和时间派发都是自行运作的。换句话说,无论是修改内部实现还是优化内部逻辑,我们都可以很轻松地做到,这点和过去的 Native 应用开发有很大区别,使用 Native 开发需要各种 Hook,API 还有较高的风险。

快速内存分配

Flutter框架使用函数式流,这使得它在很大程度上依赖于底层的内存分配器。因此,拥有一个能够有效地处理琐碎任务的内存分配器将显得十分重要,在缺乏此功能的语言中,Flutter将无法有效地工作。当然Chrome V8的JavaScript引擎在内存分配上也已经做的很好,事实上Dart开发团队的很多成员都是来自Chrome团队的,所以在内存分配上Dart并不能作为超越JavaScript的优势,而对于Flutter来说,它需要这样的特性,而Dart也正好满足而已。

类型安全

由于Dart是类型安全的语言,支持静态类型检测,所以可以在编译前发现一些类型的错误,并排除潜在问题,这一点对于前端开发者来说可能会更具有吸引力。与之不同的,JavaScript是一个弱类型语言,也因此前端社区出现了很多给JavaScript代码添加静态类型检测的扩展语言和工具,如:微软的TypeScript以及Facebook的Flow。相比之下,Dart本身就支持静态类型,这是它的一个重要优势。

阅读全文 »

Flutter知识库

发表于 2020-03-01 | 分类于 学习笔记

Flutter WIKI

[TOC]

教程

《Flutter官方中文教程》

  • Flutter for Android 开发者
  • Flutter for iOS 开发者

《Flutter实战》

《Flutter核心技术与实战》

《Flutter完整开发实战详解 》

带你快速掌握Flutter图片开发核心技能

架构相关

Flutter+Serverless端到端研发架构实践

编译技术在服务端的探索和应用

最佳实践

Flutter 沙龙回顾 | 跨平台技术趋势及字节跳动 Flutter 架构实践

Flutter 在字节跳动的现状与工程实践

京东:将Flutter扩展到微信小程序端的探索

怎样的Flutter Engine定制流程,才能实现真正“开箱即用”?

优化性能

Flutter 沙龙回顾 | 如何缩减接近 50% 的 Flutter 包体积

做一个高一致性、高性能的Flutter动态渲染,真的很难么?

复杂业务如何保证Flutter的高性能高流畅度?

阅读全文 »

解决mac下的Sourcetree每次拉取提交都需要输入密码

发表于 2019-05-07 | 分类于 学习笔记

[TOC]
最近重装了一次mac,并且重做了一下开发环境,结果以前的sourceTree项目的GIT密码始终保存不到Mac的钥匙串中,明明在钥匙串中是存在的.但是在使用sourceTree pull/push代码的时候还是需要再输入密码,很是繁琐.

于是,网上搜索了一下,说的在https模式下,Mac需要使用osxkeychain凭据助手,并在Git中设置使用. 并且如果已经安装了brew的应该会自带了osxkeychain.但是奇怪的是,我安装了brew的,使用brew安装应用也没有问题.那就只能手动的再设置一次了.

使用方法

先使用命令下载 git-credential-osxkeychain

1
curl http://github-media-downloads.s3.amazonaws.com/osx/git-credential-osxkeychain -o git-credential-osxkeychain

把git-credential-osxkeychain 放入 bin目录

1
mv git-credential-osxkeychain /usr/local/bin

给git-credential-osxkeychain赋权限

1
chmod u+x /usr/local/bin/git-credential-osxkeychain

在Git全局配置中进行设置(也可以在某一个项目里面设置):

1
git config --global credential.helper osxkeychain

经过上面的设置,下次访问https的项目时只需要输入一次密码,就会存储到osx的钥匙串中了,以后再也不会在Git中询问了.

Flutter SDK安装和诊断

发表于 2019-04-02 | 分类于 学习笔记

[TOC]

安装

本文以Mac系统为例

访问官网安装:

https://flutter.dev/docs/get-started/install/macos

下载SDK包flutter_macos_v1.2.1-stable.zip

命令行执行下面几个步骤:

1
2
3
4
5
➜ cd ~/development //替换成自己的目录
➜ unzip ~/Downloads/flutter_macos_v1.2.1-stable.zip
➜ export PATH="$PATH:`pwd`/flutter/bin"
➜ flutter precache
➜ flutter doctor
阅读全文 »

Operation和OperationQueue温习总结

发表于 2019-02-01 | 分类于 回顾温习

[TOC]

NSOperation、NSOperationQueue 简介、操作和操作队列、使用步骤和基本使用方法、控制串行/并发执行、NSOperation 操作依赖和优先级、线程间的通信、线程同步和线程安全,以及 NSOperation、NSOperationQueue 常用属性和方法归纳。

1. NSOperation、NSOperationQueue 简介

NSOperation、NSOperationQueue 是苹果提供给我们的一套多线程解决方案。实际上 NSOperation、NSOperationQueue 是基于 GCD 更高一层的封装,完全面向对象。但是比 GCD 更简单易用、代码可读性也更高。

为什么要使用 NSOperation、NSOperationQueue?

  • 可添加完成的代码块,在操作完成后执行。
  • 添加操作之间的依赖关系,方便的控制执行顺序。
  • 设定操作执行的优先级。
  • 可以很方便的取消一个操作的执行。
  • 使用 KVO 观察对操作执行状态的更改:isExecuteing、isFinished、isCancelled。

2. NSOperation、NSOperationQueue 操作和操作队列

既然是基于 GCD 的更高一层的封装。那么,GCD 中的一些概念同样适用于 NSOperation、NSOperationQueue。在 NSOperation、NSOperationQueue 中也有类似的任务(操作)和队列(操作队列)的概念。

  • 操作(Operation):
    • 执行操作的意思,换句话说就是你在线程中执行的那段代码。
    • 在 GCD 中是放在 block 中的。在 NSOperation 中,我们使用 NSOperation 子类 NSInvocationOperation、NSBlockOperation,或者自定义子类来封装操作。
  • 操作队列(Operation Queues):
    • 这里的队列指操作队列,即用来存放操作的队列。不同于 GCD 中的调度队列 FIFO(先进先出)的原则。NSOperationQueue 对于添加到队列中的操作,首先进入准备就绪的状态(就绪状态取决于操作之间的依赖关系),然后进入就绪状态的操作的开始执行顺序(非结束执行顺序)由操作之间相对的优先级决定(优先级是操作对象自身的属性)。
    • 操作队列通过设置最大并发操作数(maxConcurrentOperationCount)来控制并发、串行。
    • NSOperationQueue 为我们提供了两种不同类型的队列:主队列和自定义队列。主队列运行在主线程之上,而自定义队列在后台执行。

3. NSOperation、NSOperationQueue 使用步骤

NSOperation 需要配合 NSOperationQueue 来实现多线程。因为默认情况下,NSOperation 单独使用时系统同步执行操作,配合 NSOperationQueue 我们能更好的实现异步执行。
NSOperation 实现多线程的使用步骤分为三步:

  • 创建操作:先将需要执行的操作封装到一个 NSOperation 对象中。
  • 创建队列:创建 NSOperationQueue 对象。
  • 将操作加入到队列中:将 NSOperation 对象添加到 NSOperationQueue 对象中。

之后呢,系统就会自动将 NSOperationQueue 中的 NSOperation 取出来,在新线程中执行操作。
下面我们来学习下 NSOperation 和 NSOperationQueue 的基本使用。

4. NSOperation 和 NSOperationQueue 基本使用

4.1 创建操作

NSOperation 是个抽象类,不能用来封装操作。我们只有使用它的子类来封装操作。我们有三种方式来封装操作。

  • 使用子类 NSInvocationOperation
  • 使用子类 NSBlockOperation
  • 自定义继承自 NSOperation 的子类,通过实现内部相应的方法来封装操作。

在不使用 NSOperationQueue,单独使用 NSOperation 的情况下系统同步执行操作,下面我们学习以下操作的三种创建方式。

阅读全文 »

GCD回顾温习总结(Swift)

发表于 2019-01-30 | 分类于 回顾温习

[TOC]

1. GCD 简介

什么是 GCD 呢?

Grand Central Dispatch(GCD) 是 Apple 开发的一个多核编程的较新的解决方法。它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。它是一个在线程池模式的基础上执行的并发任务。在 Mac OS X 10.6 雪豹中首次推出,也可在 iOS 4 及以上版本使用。

为什么要用 GCD 呢?

  • GCD 可用于多核的并行运算
  • GCD 会自动利用更多的 CPU 内核(比如双核、四核)
  • GCD 会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
  • 程序员只需要告诉 GCD 想要执行什么任务,不需要编写任何线程管理代码

2. GCD 任务和队列

任务

就是执行操作的意思,换句话说就是你在线程中执行的那段代码。在 GCD 中是放在 block 中的。执行任务有两种方式:同步执行(sync)和异步执行(async)。两者的主要区别是:是否等待队列的任务执行结束,以及是否具备开启新线程的能力。

  • 同步执行(sync):
    • 同步添加任务到指定的队列中,在添加的任务执行结束之前,会一直等待,直到队列里面的任务完成之后再继续执行。
    • 只能在当前线程中执行任务,不具备开启新线程的能力。
  • 异步执行(async):
    • 异步添加任务到指定的队列中,它不会做任何等待,可以继续执行任务。
    • 可以在新的线程中执行任务,具备开启新线程的能力。

      注意:异步执行(async)虽然具有开启新线程的能力,但是并不一定开启新线程。这跟任务所指定的队列类型有关。

阅读全文 »

建立私有的pod库

发表于 2019-01-16 | 分类于 经验心得

GitHub私有库居然免费了,很开心的把原来的pod库迁移了过来,并写了一个教程。

创建并设置一个私有的Spec Repo

  1. 首先我们在github上建立一个自己的仓库 LocalPod(仓库名字任意)
  2. 在本地创建Spec Repo
    1
    pod repo add LocalPod https://github.com/davidlin7876/LocalPod.git

进入 ~/.cocoapods/repos 目录此时就能看到我们自己的pod仓库了

1
open ~/.cocoapods/repos

阅读全文 »

ios deprecated 警告消除 强迫症的选择

发表于 2018-10-10 | 分类于 经验心得

[TOC]

1
2
3
4
5
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
这里写出现警告的代码
#pragma clang diagnostic pop

这样就消除了方法弃用的警告!

点阅读全文查看全部的Warnings对照表

阅读全文 »
123
David Lin

David Lin

资深软件工程师,架构师,PMP。2001年毕业于浙江工业大学计算机系, Mac/iOS 应用开发十数年。在虹软科技,尼禄软件工作期间任苹果平台的核心工程师。2015年创办宗布科技,负责团队技术架构,技术指导,项目团队管理。2017年加入网易杭州研究院K12部门,组建团队,技术框架和项目管理

28 日志
4 分类
13 标签
© 2021 David Lin
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.3