UI 设计模式 手势识别器
- 耦合是衡量一个程序呢写的好坏的标准之一
- 耦合是衡量模块与模块之间关联程度的指标
- 高内聚,低耦合是面向对象编程的核心思想
- 是用target /action 实现解耦 也是需要让目标去执行一个动作的地方; 代理设计模式也可以实现解耦
- 高内聚低耦合,是软件工程中的概念,是判断设计好坏的标准,主要是面向对象的设计,主要是看类的内聚性是否高,耦合度是否低。
- 内聚就是一个模块内各个元素彼此结合的紧密程度,高内聚就是一个模块内各个元素彼此结合的紧密程度高。
所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。
耦合:一个软件结构内不同模块之间互连程度的度量(耦合性也叫块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差,模块间耦合的高低取决于模块间接口的复杂性,调用的方式以及传递的信息。)
对于低耦合,粗浅的理解是:一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能 的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。这样有利于修 改和组合。[1] - 耦合性与内聚性是模块独立性的两个定性标准,将软件系统划分模块时,尽量做到高内聚低耦合,提高模块的独立性,为设计高质量的软件结构奠定基础。
有个例子很容易明白:一个程序有50个函数,这个程序执行得非常好;然而一旦你修改其中一个函数,其他49个函数都需要做修改,这就是高耦合的后果。
一旦你理解了它,你编写概要设计的时候设计类或者模块自然会考虑到“高内聚,低耦合”。 - 耦合性分类(低――高): 无直接耦合;数据耦合;标记耦合;控制耦合;公共耦合;内容耦合;
- 1>先创建一个自定义视图控制器RRViewController 类 和三个 view类( RRView ,ButtonView,CotrolView )
- 2>先在Appdelegate.m文件中导入RRViewController.h 头文件, 然后在Appdelegate.m 文件中将自定义的视图控制器代替window的根视图控制器 具体步骤如下 以下是固定写法
- a >创建window
- b > 给window 添加背景颜色
- c >显示window 窗口
- d>创建自定义视图控制器
- e>将我们创建的视图控制器,替换掉我们window的跟视图控制器
- 3>在RRViewController.m 中导入 RRVIew.h ; 在延展声明中 ,声明RRView类的实例化变量 ,然后在@implementation RRViewController 里面 写我们视图控制器的初始化方法(固定写法) 再将我们的声明的RRView 的视图替换掉 控制器自身带的view 视图,此步骤要在 重写加载图片方法中写-(void) loadView; 步骤如下
- a>在类的延展中声明类的实例化变量
- b>在@implementation RRViewController 里面写控制器的初始化方法
/*
{
//目标实例变量
id _target;
//事件实例变量
SEL _action;
}
*/
//添加点击事件
//点击view的时候,view要响应(target) 的那个方法(action )
//上边是为了保存传进来的实例变量
@property(nonatomic,assign) id target;
@property(nonatomic,assign) SEL action;
-(void)myAddTarget:(id)target action:(SEL) action;
@implementation ButtonView
//添加点击事件
-(void)myAddTarget:(id)target action:(SEL) action
{
_target = target;
_action = action;
}
//当触摸开始时,会执行touchBegan 方法
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//把在控制器里面写的方法和他 联系起来
//触摸事件发生后 ,用target 去调用传进来的action 方法
//内存泄露
//当触摸事件发生时,视图会执行touchebegan方法
//给target发消息,即action
- delegate也是用来解耦的,它不再简简单单让目标去执行一个动作了
- 而是delegate去处理一些列事件 ,就像UITextFieldDelegate一样,能监测将要开始编辑,已经开始编辑,return 按钮点击..
- 控件有一些列时间点,控制器可以实现这个代理方法,以便在适当的时机做适当的事.
- UIImageView 是iOS中用于显示图片的类 ,iOS中几乎所有看到的图片,都是由这个类来显示的.
- 使用initWithImage : 方法 ,创建UIImageView对象
- 使用 initWIthContentOfFile : 方法,创建一个UIImage 对象
- ImageView的默认是NO,是关闭交互。要将userInteractionEnabled(响应者链是否交互)设置为YES
self.img.userInteractionEnabled = YES;
// 设置图片连续播放,实现动画效果
oneImageView.animationImages = [NSArray arrayWithObjects:[UIImage imageNamed:@"max.png"], [UIImage imageNamed:@"min.png"], nil];
oneImageView.animationDuration = 0.3f; // 设置循环一次的时间
oneImageView.animationRepeatCount = 0; // 循环的次数。设置为0时无线循环
[oneImageView startAnimating]; // 开始动画
// 获取网络中的图片
UIImage *urlImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"www.baidu.com"]]];
- 手势识别器是对触摸事件做了封装,,我们无需自己去判断某个手势是否触发,手势识别器本身就起到了识别作用,我们把重心放在识别之后要做什么操作上面
- 手势识别器是ios中比较抽象的一个类,用于识别一个手势,所谓手势 : 有规律的触摸
- 手势识别器的分类: 分别识别轻拍手势,平移手势,清扫手势缩放手势,旋转手势 ,长按手势 以及屏幕边界平移手势
- 一旦指定的手势被识别,我们可以执行我们自己定义好的的操作
- @property(nonatomic,retain) UIImageView *imageView;
- _imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"123.gif"]];
_imageView.frame =[[UIScreen mainScreen] bounds];
[self addSubview:_imageView]; - 然后完成下面的操作
//轻拍手势
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)];
//添加到视图上gesture ['dʒestʃə] 手势 ; recognizer ['rekəg,naizə] 识别器
[_imageView addGestureRecognizer:tap];
//1>设置了用几个手指点击 一般把这两个属性需要的时候写,会影响 旋转,平移,等触摸操作
//tap.numberOfTouchesRequired = 1;
//2>点击多少次才能起到效果(也就是真正的点击了)
-(void)tapAction
{
NSLog(@"轻拍了!!!!");
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress)];
//将手势识别类型添加到视图上
-(void)longPress
{
NSLog(@"常按了~~~~~");
UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotation:)];
[_imageView addGestureRecognizer:rotation];
-(void)rotation:(UIRotationGestureRecognizer *)sender
{
NSLog(@"旋转啦 ==");// transform [træns'fɔːm; trɑːns-; -nz-] 变换 ,改变
UIPinchGestureRecognizer * pinch =[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];
-(void)pinch:(UIPinchGestureRecognizer *)sender
{
NSLog(@"捏合");//scale [skeɪl] 比例
_imageView.transform = CGAffineTransformScale(_imageView.transform, sender.scale, sender.scale);
sender.scale = 1;
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
-(void)pan:(UIPanGestureRecognizer *)sender
{
CGPoint point = [sender translationInView:_imageView];
self.imageView.transform = CGAffineTransformTranslate(_imageView.transform, point.x, point.y);
[sender setTranslation:CGPointZero inView:_imageView];
[_imageView addGestureRecognizer:swipe];
// 以下是设置滑动的方向
// typedef NS_OPTIONS(NSUInteger, UISwipeGestureRecognizerDirection) {
// UISwipeGestureRecognizerDirectionRight = 1 << 0, // 从左向右滑动
// UISwipeGestureRecognizerDirectionLeft = 1 << 1, // 从右向左滑动
// UISwipeGestureRecognizerDirectionUp = 1 << 2, // 从下向上滑动
-(void)swipe:(UISwipeGestureRecognizer *)sender
{
NSLog(@"轻扫");
sender.view.transform = CGAffineTransformScale(sender.view.transform, 1, 1);//scale [skeɪl] 规模
[sender setDirection:1];
UIScreenEdgePanGestureRecognizer *screen = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(screen:)];
-(void)screen:(UIScreenEdgePanGestureRecognizer *)sender
{
NSLog(@"屏幕边缘的");
CGPoint point = [sender translationInView:sender.view];
sender.view.transform = CGAffineTransformTranslate(sender.view.transform, point.x, 0);
[sender setTranslation:CGPointZero inView:sender.view];
- 我们不会直接使用手势识别器这个抽象父类,而是根据需要使用特定的手势识别器创建对象
- 1>创建UIxxxGesturnRecognizer 对象,使用initWithTarget:action : 方法
- 配置要识别的手势的相关信息
- 将手势添加到某个视图上
- 实现手势识别器里定义的方法
- transform 是view的一个重要属性 ,它在矩形层面上改变view的显示状态,能实现view的缩放,旋转,平移等功能
- target …action 和delegate 是很重要的设计模式,务必理解原理以及熟练使用
- 手势识别器是很常用的类,在日常开发中经常使用,需要牢记每个手势识别器的特点以及注意事项
- transform 是view的重要属性 ,在屏幕旋转方面用的比较多
//{
// NSLog(@"开始");
//
//
// //来回切
// if([_imageView superview])
// {
// [_imageView removeFromSuperview];
// self.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1];
//
//
// }else
// {
//
// [self addSubview:_imageView];
// }
- 耦合是衡量一个程序呢写的好坏的标准之一
- 耦合是衡量模块与模块之间关联程度的指标
- 高内聚,低耦合是面向对象编程的核心思想
- 是用target /action 实现解耦 也是需要让目标去执行一个动作的地方; 代理设计模式也可以实现解耦
- 高内聚低耦合,是软件工程中的概念,是判断设计好坏的标准,主要是面向对象的设计,主要是看类的内聚性是否高,耦合度是否低。
- 内聚就是一个模块内各个元素彼此结合的紧密程度,高内聚就是一个模块内各个元素彼此结合的紧密程度高。
所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。
耦合:一个软件结构内不同模块之间互连程度的度量(耦合性也叫块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差,模块间耦合的高低取决于模块间接口的复杂性,调用的方式以及传递的信息。)
对于低耦合,粗浅的理解是:一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能 的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。这样有利于修 改和组合。[1] - 耦合性与内聚性是模块独立性的两个定性标准,将软件系统划分模块时,尽量做到高内聚低耦合,提高模块的独立性,为设计高质量的软件结构奠定基础。
有个例子很容易明白:一个程序有50个函数,这个程序执行得非常好;然而一旦你修改其中一个函数,其他49个函数都需要做修改,这就是高耦合的后果。
一旦你理解了它,你编写概要设计的时候设计类或者模块自然会考虑到“高内聚,低耦合”。 - 耦合性分类(低――高): 无直接耦合;数据耦合;标记耦合;控制耦合;公共耦合;内容耦合;
- 1>先创建一个自定义视图控制器RRViewController 类 和三个 view类( RRView ,ButtonView,CotrolView )
- 2>先在Appdelegate.m文件中导入RRViewController.h 头文件, 然后在Appdelegate.m 文件中将自定义的视图控制器代替window的根视图控制器 具体步骤如下 以下是固定写法
- a >创建window
- b > 给window 添加背景颜色
- c >显示window 窗口
- d>创建自定义视图控制器
- e>将我们创建的视图控制器,替换掉我们window的跟视图控制器
- 3>在RRViewController.m 中导入 RRVIew.h ; 在延展声明中 ,声明RRView类的实例化变量 ,然后在@implementation RRViewController 里面 写我们视图控制器的初始化方法(固定写法) 再将我们的声明的RRView 的视图替换掉 控制器自身带的view 视图,此步骤要在 重写加载图片方法中写-(void) loadView; 步骤如下
- a>在类的延展中声明类的实例化变量
- b>在@implementation RRViewController 里面写控制器的初始化方法
/*
{
//目标实例变量
id _target;
//事件实例变量
SEL _action;
}
*/
//添加点击事件
//点击view的时候,view要响应(target) 的那个方法(action )
//上边是为了保存传进来的实例变量
@property(nonatomic,assign) id target;
@property(nonatomic,assign) SEL action;
-(void)myAddTarget:(id)target action:(SEL) action;
@implementation ButtonView
//添加点击事件
-(void)myAddTarget:(id)target action:(SEL) action
{
_target = target;
_action = action;
}
//当触摸开始时,会执行touchBegan 方法
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//把在控制器里面写的方法和他 联系起来
//触摸事件发生后 ,用target 去调用传进来的action 方法
//内存泄露
//当触摸事件发生时,视图会执行touchebegan方法
//给target发消息,即action
- delegate也是用来解耦的,它不再简简单单让目标去执行一个动作了
- 而是delegate去处理一些列事件 ,就像UITextFieldDelegate一样,能监测将要开始编辑,已经开始编辑,return 按钮点击..
- 控件有一些列时间点,控制器可以实现这个代理方法,以便在适当的时机做适当的事.
- UIImageView 是iOS中用于显示图片的类 ,iOS中几乎所有看到的图片,都是由这个类来显示的.
- 使用initWithImage : 方法 ,创建UIImageView对象
- 使用 initWIthContentOfFile : 方法,创建一个UIImage 对象
- ImageView的默认是NO,是关闭交互。要将userInteractionEnabled(响应者链是否交互)设置为YES
self.img.userInteractionEnabled = YES;
// 设置图片连续播放,实现动画效果
oneImageView.animationImages = [NSArray arrayWithObjects:[UIImage imageNamed:@"max.png"], [UIImage imageNamed:@"min.png"], nil];
oneImageView.animationDuration = 0.3f; // 设置循环一次的时间
oneImageView.animationRepeatCount = 0; // 循环的次数。设置为0时无线循环
[oneImageView startAnimating]; // 开始动画
// 获取网络中的图片
UIImage *urlImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"www.baidu.com"]]];
- 手势识别器是对触摸事件做了封装,,我们无需自己去判断某个手势是否触发,手势识别器本身就起到了识别作用,我们把重心放在识别之后要做什么操作上面
- 手势识别器是ios中比较抽象的一个类,用于识别一个手势,所谓手势 : 有规律的触摸
- 手势识别器的分类: 分别识别轻拍手势,平移手势,清扫手势缩放手势,旋转手势 ,长按手势 以及屏幕边界平移手势
- 一旦指定的手势被识别,我们可以执行我们自己定义好的的操作
- @property(nonatomic,retain) UIImageView *imageView;
- _imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"123.gif"]];
_imageView.frame =[[UIScreen mainScreen] bounds];
[self addSubview:_imageView]; - 然后完成下面的操作
//轻拍手势
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction)];
//添加到视图上gesture ['dʒestʃə] 手势 ; recognizer ['rekəg,naizə] 识别器
[_imageView addGestureRecognizer:tap];
//1>设置了用几个手指点击 一般把这两个属性需要的时候写,会影响 旋转,平移,等触摸操作
//tap.numberOfTouchesRequired = 1;
//2>点击多少次才能起到效果(也就是真正的点击了)
-(void)tapAction
{
NSLog(@"轻拍了!!!!");
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress)];
//将手势识别类型添加到视图上
-(void)longPress
{
NSLog(@"常按了~~~~~");
UIRotationGestureRecognizer *rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotation:)];
[_imageView addGestureRecognizer:rotation];
-(void)rotation:(UIRotationGestureRecognizer *)sender
{
NSLog(@"旋转啦 ==");// transform [træns'fɔːm; trɑːns-; -nz-] 变换 ,改变
UIPinchGestureRecognizer * pinch =[[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];
-(void)pinch:(UIPinchGestureRecognizer *)sender
{
NSLog(@"捏合");//scale [skeɪl] 比例
_imageView.transform = CGAffineTransformScale(_imageView.transform, sender.scale, sender.scale);
sender.scale = 1;
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
-(void)pan:(UIPanGestureRecognizer *)sender
{
CGPoint point = [sender translationInView:_imageView];
self.imageView.transform = CGAffineTransformTranslate(_imageView.transform, point.x, point.y);
[sender setTranslation:CGPointZero inView:_imageView];
[_imageView addGestureRecognizer:swipe];
// 以下是设置滑动的方向
// typedef NS_OPTIONS(NSUInteger, UISwipeGestureRecognizerDirection) {
// UISwipeGestureRecognizerDirectionRight = 1 << 0, // 从左向右滑动
// UISwipeGestureRecognizerDirectionLeft = 1 << 1, // 从右向左滑动
// UISwipeGestureRecognizerDirectionUp = 1 << 2, // 从下向上滑动
-(void)swipe:(UISwipeGestureRecognizer *)sender
{
NSLog(@"轻扫");
sender.view.transform = CGAffineTransformScale(sender.view.transform, 1, 1);//scale [skeɪl] 规模
[sender setDirection:1];
UIScreenEdgePanGestureRecognizer *screen = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(screen:)];
-(void)screen:(UIScreenEdgePanGestureRecognizer *)sender
{
NSLog(@"屏幕边缘的");
CGPoint point = [sender translationInView:sender.view];
sender.view.transform = CGAffineTransformTranslate(sender.view.transform, point.x, 0);
[sender setTranslation:CGPointZero inView:sender.view];
- 我们不会直接使用手势识别器这个抽象父类,而是根据需要使用特定的手势识别器创建对象
- 1>创建UIxxxGesturnRecognizer 对象,使用initWithTarget:action : 方法
- 配置要识别的手势的相关信息
- 将手势添加到某个视图上
- 实现手势识别器里定义的方法
- transform 是view的一个重要属性 ,它在矩形层面上改变view的显示状态,能实现view的缩放,旋转,平移等功能
- target …action 和delegate 是很重要的设计模式,务必理解原理以及熟练使用
- 手势识别器是很常用的类,在日常开发中经常使用,需要牢记每个手势识别器的特点以及注意事项
- transform 是view的重要属性 ,在屏幕旋转方面用的比较多
//{
// NSLog(@"开始");
//
//
// //来回切
// if([_imageView superview])
// {
// [_imageView removeFromSuperview];
// self.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1];
//
//
// }else
// {
//
// [self addSubview:_imageView];
// }
UI 设计模式 手势识别器的更多相关文章
- UI基础:target...action设计模式,手势识别器.UIimageview
使用target..action和delegate设计模式可以实现解耦.使代码更加优化. 手势识别器: 手势识别器:是对触摸事件做了封装,无需自己去判断某个手势是否触发,手势识别器本身起到了识别作用, ...
- iOS开发UI高级手势识别器
####手势识别器 UIGestureRecognizer类 ·UITapGestureRecognizer(轻击) ·UIPinchGestureRecognizer(捏合) ·UIPanGestu ...
- [iOS UI进阶 - 3.2] 手势识别器UIGestureRecognizer
A.系统提供的手势识别器 1.敲击手势 UITapGestureRecognizer numberOfTapsRequired: 敲击次数 numberOfTouchesRequired: 同时敲 ...
- iOS 七大手势之轻拍,长按,旋转手势识别器方法
一.监听触摸事件的做法 如果想监听一个view上面的触摸事件,之前的做法通常是:先自定义一个view,然后再实现view的touches方法,在方法内部实现具体处理代码 通过touches方法监听 ...
- iOS 触摸事件与手势识别器(Gesture Recognizers)
Gesture Recognizers与触摸事件分发 通过一个问题引出今天的知识: 1.大家应该都遇见过 当需要给tableView 添加一个tap 手势识别 但是tableView 的上的事件(滑动 ...
- iOS 七大手势之轻拍,长按,旋转手势识别器方法-赵小波
一.监听触摸事件的做法 如果想监听一个view上面的触摸事件,之前的做法通常是:先自定义一个view,然后再实现view的touches方法,在方法内部实现具体处理代码 通过touches方法监听vi ...
- iOS 手势识别器(UIGestureRecognizer)
UIGestureRecognizer是一个抽象类,定义了所有手势的基本行为,使用它的子类才能处理具体的手势. UIGestureRecognizer的子类有: UITapGestureRecogni ...
- iOS的触摸事件的用法以及和手势识别器的区别
1.首先来介绍下触摸事件和手势识别器的利与弊 触摸事件和手势识别器二者之间有直接的关系 手势识别器是在触摸事件的基础上演变过来的 当我们用到触摸事件时 默认的uiview是没有什么效果的 只能自定义v ...
- iOS常用手势识别器
手势识别状态: typedef NS_ENUM(NSInteger, UIGestureRecognizerState) { // 没有触摸事件发生,所有手势识别的默认状态 UIGestureReco ...
随机推荐
- C的memcpy和strcpy的区别
strcpy是拷贝字符串,以\0为标志结束(即一旦遇到数据值为0的内存地址拷贝过程即停止) strcpy的原型为 char *strcpy(char *dest, const char *src) 而 ...
- secache 详解
介绍下secache缓存,它是属于文件缓存.简单来说,文件缓存就是把缓存数据存储到文件系统 (硬盘)中了,比 内存缓存要慢一些,但是也是有一点优点的. 1.磁盘容量大, 2保存到硬盘,说明 掉电后数据 ...
- 通过Spring Data Neo4J操作您的图形数据库
在前面的一篇文章<图形数据库Neo4J简介>中,我们已经对其内部所使用的各种机制进行了简单地介绍.而在我们尝试对Neo4J进行大版本升级时,我发现网络上并没有任何成型的样例代码以及简介,而 ...
- ios NSString拼接方法总结
NSString* string; // 结果字符串 02 NSString* string1, string2; //已存在的字符串,需要将string1和string2连接起来 03 04 / ...
- 微信小程序教程(第四篇)
小程序开发基本框架及其限制与优化 开发基本框架(MINA框架) └─ Project-folder/ ·································· 项目所在目录 ├─ page ...
- [CSS3] 学习笔记-CSS3盒子样式
1.盒子的类型 在CSS3中,使用display来定义盒子的类型,包括block,inline,inline-block类型.div元素和P元素,属于block类型,span元素和a元素,属于inli ...
- [CSS3]学习笔记-CSS基本样式讲解
1.CSS样式-背景 CSS运行应用纯色作背景,也允许使用背景图像创建相当复杂的效果 <!DOCTYPE html> <html> <head lang="en ...
- Codeforces 712B
B. Memory and Trident time limit per test:2 seconds memory limit per test:256 megabytes input:standa ...
- Google HTML/CSS 编码规范
Google HTML/CSS 规范 本文介绍了 Google 推荐的 HTML 和 CSS 编写格式规范,以建立良好的个人编码习惯. 1.通用样式规范 省略图片.样式.脚本以及其他媒体文件 URL ...
- [原创.数据可视化系列之十二]使用 nodejs通过async await建立同步数据抓取
做数据分析和可视化工作,最重要的一点就是数据抓取工作,之前使用Java和python都做过简单的数据抓取,感觉用的很不顺手. 后来用nodejs发现非常不错,通过js就可以进行数据抓取工作,类似jqu ...