葡京网上娱乐场200多摆放合计导图改变了我什么?

描绘在前面:今晚会见享受200基本上摆合计导图改变了自啊?也许是盖忙,也许是因自己未敷重视自己?还是为这个对自己而言最好简单,还是坐心里来极多之口舌不清楚怎样去说呢?我及今才起写,不过一切都是可以的,相信自己。我的初心就是将团结之故事说给你听,告诉您什么样利用思维导图工具来转自己。这是讲稿。

Designer News.png

各位直播中的伴等!

前段时间在design+code打了一个读iOS设计及编码在线课程,使用Sketch设计App,然后使用Swift语言实现Designer
News客户端。作者Meng
To曾上马源及Github:MengTo/DesignerNewsApp ·
GitHub。虽然实现通Designer
News客户端基本功能,但是以臃肿MVC(Model-View-Controller)架构,不易被代码的测试与复用,于是利用ReactiveCocoa贯彻MVVM(Model-View-View
Model)架构,加上一个用Objective-C实现的BDD测试框架Kiwi来单元测试,就足以表现让开发iOS
App。

世家夜间吓!

ReactiveCocoa

ReactiveCocoa是一个用Objective-C编写,具有函数式和响应式特性的编程框架。大多数底开发者他们解决问题之思考方式还是何等做到任务,通常的做法即是编制很多命令,然后修改要数据结构的状态,这种编程范式叫做命令式编程(Imperative
Programming)。与命令式编程不同之是函数式编程(Functional
Programming),思考问题的措施是成功什么任务,怎样描述是职责。关于对函数式编程入门概念的明,可以参见酷壳《函数式编程》这首文章,深入浅出对函数式编程的思想方式、特性与技艺通过一些演示来教学。

深开心以2018年1月13日如此的一个礼拜晚上及大家共同来聊一且思维导图给自身带的更动。

ReactiveCocoa解决什么问题?

  • 对象期间状态和状态的依靠过多问题
    借ReactiveCocoa中一个例来验证:用户在登录界面时,有一个用户称输入框和密码输入框,还有一个报到按钮。登录交互要求如下:

  • 当用户称和密码可验证格式,并且之前还并未登录时,登录按钮才会点击。

  • 当点击登录成功登录后,设置已报到状态。

传统的做法代码如下:

static void *ObservationContext = &ObservationContext;

- (void)viewDidLoad {
   [super viewDidLoad];

   [LoginManager.sharedManager addObserver:self forKeyPath:@"loggingIn" options:NSKeyValueObservingOptionInitial context:&ObservationContext];
   [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(loggedOut:) name:UserDidLogOutNotification object:LoginManager.sharedManager];

   [self.usernameTextField addTarget:self action:@selector(updateLogInButton) forControlEvents:UIControlEventEditingChanged];
   [self.passwordTextField addTarget:self action:@selector(updateLogInButton) forControlEvents:UIControlEventEditingChanged];
   [self.logInButton addTarget:self action:@selector(logInPressed:) forControlEvents:UIControlEventTouchUpInside];
}

- (void)dealloc {
   [LoginManager.sharedManager removeObserver:self forKeyPath:@"loggingIn" context:ObservationContext];
   [NSNotificationCenter.defaultCenter removeObserver:self];
}

- (void)updateLogInButton {
   BOOL textFieldsNonEmpty = self.usernameTextField.text.length > 0 && self.passwordTextField.text.length > 0;
   BOOL readyToLogIn = !LoginManager.sharedManager.isLoggingIn && !self.loggedIn;
   self.logInButton.enabled = textFieldsNonEmpty && readyToLogIn;
}

- (IBAction)logInPressed:(UIButton *)sender {
   [[LoginManager sharedManager]
       logInWithUsername:self.usernameTextField.text
       password:self.passwordTextField.text
       success:^{
           self.loggedIn = YES;
       } failure:^(NSError *error) {
           [self presentError:error];
       }];
}

- (void)loggedOut:(NSNotification *)notification {
   self.loggedIn = NO;
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
   if (context == ObservationContext) {
       [self updateLogInButton];
   } else {
       [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
   }
}

以上使用KVO、Notification、Target-Action等处理事件或信息的法编写的代码分散到各个地方,变得乱七八糟和难以知晓;但是采取RACSignal统一处理的话,代码更加简明与易读。使用RAC后代码如下:

- (void)viewDidLoad {
    [super viewDidLoad];

    @weakify(self);

    RAC(self.logInButton, enabled) = [RACSignal
        combineLatest:@[
            self.usernameTextField.rac_textSignal,
            self.passwordTextField.rac_textSignal,
            RACObserve(LoginManager.sharedManager, loggingIn),
            RACObserve(self, loggedIn)
        ] reduce:^(NSString *username, NSString *password, NSNumber *loggingIn, NSNumber *loggedIn) {
            return @(username.length > 0 && password.length > 0 && !loggingIn.boolValue && !loggedIn.boolValue);
        }];

    [[self.logInButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(UIButton *sender) {
        @strongify(self);

        RACSignal *loginSignal = [LoginManager.sharedManager
            logInWithUsername:self.usernameTextField.text
            password:self.passwordTextField.text];

            [loginSignal subscribeError:^(NSError *error) {
                @strongify(self);
                [self presentError:error];
            } completed:^{
                @strongify(self);
                self.loggedIn = YES;
            }];
    }];

    RAC(self, loggedIn) = [[NSNotificationCenter.defaultCenter
        rac_addObserverForName:UserDidLogOutNotification object:nil]
        mapReplace:@NO];
}
  • 风土MVC架构中,由于Controller承担数据证实、映射数据模型到View和操作View层次结构等多个事,导致Controller过于臃肿,不便利代码的复用和测试。
    每当风俗的MVC架构中,主要有Model,
    View和Controller三部分组成。Model主要是保留数据以及处理事情逻辑,View将数据展示,而Controller调解关于Model和View之间的保有交互。
    当数达时,Model通过Key-Value Observation来打招呼View Controller,
    然后View Controller更新View。当View与用户交互后,View
    Controller更新Model。

Typical MVC paradigm.png

刚好而你所见,View
Controller隐式承担多义务:数据证明、映射数据模型到View和操作View层次结构。MVVM将多逻辑从View
Controller移走及View-Model,等介绍完ReactiveCocoa后会见介绍MVVM架构。还有一部分有关什么减负View
Controller好文章请参见objc中国再也轻量的View
Controllers系列:

  • 再轻量的 View
    Controllers

  • 整洁的 Table View
    代码

  • 测试 View
    Controllers

  • 运Signal来替代KVO、Notification、Delegate和Target-Action等传递信息
    iOS开发被有多消息传递方式,KVO、Notification、Delegate、Block和Target-Action,对于其之间有啊区别与如何抉择要参见《消息传递机制》。但RAC提供RACSignal来归并消息传递机制,不再为如何选择何种传递消息方式要抑郁。

    RAC对常用UI控件事件进展封装成一个RACSignal对象,以便对出的各种风波展开监听。
    KVO示例代码如下:

// When self.username changes, logs the new name to the console.
//
// RACObserve(self, username) creates a new RACSignal that sends the current
// value of self.username, then the new value whenever it changes.
// -subscribeNext: will execute the block whenever the signal sends a value.
[RACObserve(self, username) subscribeNext:^(NSString *newName) {
    NSLog(@"%@", newName);
}];

Target-Action示例代码如下:

// Logs a message whenever the button is pressed.
//
// RACCommand creates signals to represent UI actions. Each signal can
// represent a button press, for example, and have additional work associated
// with it.
//
// -rac_command is an addition to NSButton. The button will send itself on that
// command whenever it's pressed.
self.button.rac_command = [[RACCommand alloc] initWithSignalBlock:^(id _) {
    NSLog(@"button was pressed!");
    return [RACSignal empty];
}];

Notification示例代码如下:

 // Respond to when email text start and end editing
 [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UITextFieldTextDidBeginEditingNotification object:self.emailTextField] subscribeNext:^(id x) {
      [self.emailImageView animate];
      self.emailImageView.image = [UIImage imageNamed:@"icon-mail-active"];
      self.emailTextField.background = [UIImage imageNamed:@"input-outline-active"];
  }];

 [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UITextFieldTextDidEndEditingNotification object:self.emailTextField] subscribeNext:^(id x) {
      self.emailTextField.background = [UIImage imageNamed:@"input-outline"];
      self.emailImageView.image = [UIImage imageNamed:@"icon-mail"];
  }];

除,还足以采取AFNetworking做客服务器后对回到数据从创立一个RACSignal。示例代码如下:

 + (RACSubject*)storiesForSection:(NSString*)section page:(NSInteger)page
{
    RACSubject* signal = [RACSubject subject];

    NSDictionary* parameters = @{
        @"page" : [NSString stringWithFormat:@"%ld", (long)page],
        @"client_id" : clientID
    };

    [[AFHTTPSessionManager manager] GET:[DesignerNewsURL stroiesURLString] parameters:parameters success:^(NSURLSessionDataTask* task, id responseObject) {
                NSLog(@"url string = %@", task.currentRequest.URL);
                [signal sendNext:responseObject];
                [signal sendCompleted];
    } failure:^(NSURLSessionDataTask* task, NSError* error) {
                NSLog(@"url string = %@", task.currentRequest.URL);
                [signal sendError:error];
    }];

    return signal;
}

些微朋友可以感觉有点奇怪,上面代码明明返回的是RACSubject,而不是RACSignal,其实RACSubject是RACSignal的子类,但是RACSubject写有代码更加从简,所以采取RACSubject(官方不推荐应用)。等下将RAC核心类设计时,你不怕会见询问它中间的涉嫌与哪些选择。

你们了解呢?

ReactiveCocoa核心类设计

至于RAC核心类设计,官方文档有详尽的说明:Framework
Overview

直播分享和另地方不同等,是温馨一个人当一个房里对正值相同光手机说话,会发生平等栽众目睽睽的孤独感,所以,昨天,我有请求一些爱人,如果你有空,可以来直播间支持自。

Sequence和Signal基本操作

询问完个RAC核心类设计下,要学会对Sequence和Signal基本操作,比如:用signal执行side
effects,转换streams, 合并stream和集合signal。详情请查阅官方文档:Basic
Operators

唯恐此时此刻,在真实的世界中,我们无能为力测算,但当真的情丝中,我们是在一齐的,您的那颗心会于你的房间、旅游之旅途、朋友之闲话中要么其他的地方偷地陪伴在本人,我想我是足以瞥见,感受及的。

MVVM架构

MVVM high level.png

每当MVVM架构中,通常还以view和view
controller看做一个一体化。相对于事先MVC架构中view
controller执行很多以view和model之间数据映射和互相的行事,现在用她交给view
model去开。
关于选择哪种机制来更新view
model或view是从未有过强制的,但日常我们都挑ReactiveCocoa。ReactiveCocoa会监听model的改动然后拿这些改变映射到view
model的习性被,并且可以执行有事务逻辑。
推选个例来说,有一个model包含一个dateAdded的特性,我眷恋监听它的变动然后更新view
model的dateAdded属性。但model的dateAdded属性的数据类型是NSDate,而view
model的数据类型是NSString,所以于view
model的init方法中展开数据绑定,但用多少类型转换。示例代码如下:

RAC(self,dateAdded) = [RACObserve(self.model,dateAdded) map:^(NSDate*date){ 
    return [[ViewModel dateFormatter] stringFromDate:date];
}];

ViewModel调用dateFormatter进行数量易,且方法dateFormatter可以复用到其他地方。然后view
controller监听view model的dateAdded属性且绑定到label的text属性。

RAC(self.label,text) = RACObserve(self.viewModel,dateAdded);

今天咱们抽象出日期变到字符串的逻辑到view
model,使得代码可以测试复用,并且帮view controller瘦身

自家看本身的教工郭立中、橙子伙伴朱进伟、马兰,老铁艾伦、雨小朵、佳琦、Shirley、新情人紫衣等众多爱人就留言支持自己了。有着大爱之北大才女尔玛先生、弗兰克先生,好姊妹陌上花起来,新情人王晓琴,熊猫伙伴张仁喜、橙子伙伴琼咪,杰克思维导图群的橙西宝、尔玛心理群的枫之然,正念打卡群群主小英等朋友用分享连接为爱人的实际行动支持了自。我吗信任有多情侣也在手机的那端默默支持自己。这叫我发莫大的暖。

Kiwi

Kiwi是一个iOS行为使开发(Behavior Driven
Development)的堆栈。相比于Xcode提供单元测试的XCTest是由测试的角度思考问题,而Kiwi是打行为的角度思考问题,测试用例都按三段式Given-When-Then的叙述,清晰地发表测试用例是测试什么样的靶子要数据结构,在根据什么上下文或现象,然后做出什么响应。

describe(@"Team", ^{
    context(@"when newly created", ^{
        it(@"has a name", ^{
            id team = [Team team];
            [[team.name should] equal:@"Black Hawks"];
        });

        it(@"has 11 players", ^{
            id team = [Team team];
            [[[team should] have:11] players];
        });
    });
});

我们充分容易因上下文将那提为Given..When..Then的三段式自然语言

Given a Team, when be newly created, it should have a name, it should have 11 player

于是Xcode自带的XCTest测试框架写过测试代码的意中人可能体会至,以上代码更加容易阅读与透亮。就算以后产生新的开发者入或者修护代码时,不待极好的基金去读与清楚代码。具体怎么使Kiwi,请参考两篇文章:

  • TDD的iOS开发初步与Kiwi使用入门
  • Kiwi 使用上阶 Mock, Stub,
    参数捕获和异步测试

谢谢各位小伙伴等的支撑,我特别感谢一下自己的爱人同男女,是她们呢本人创建了一个如此好之半空中,能于自身可以这么静心地以及大家拉,也感谢在直播间的君,有时空静静地联手交流,也非常感谢一些忙碌的伴们,后续能够抽时来听。

Designer News UI

每当编排Designer
News客户端代码之前,首先通过UI来打听所有App的概貌。设计Designer News
UI的工具是Sketch,想获得Designer
News UI,请点击下载Designer New
UI。

Designer News Design.png

使以有的页面还依次说明如何编写,会较耗时间,所以就以登陆页面来证实我是什么行事令开发iOS,但我会将全体项目的代码上盛传github。

实质上不随便你哟时进入直播间,一切都是可以的。如果听任了后,请一定要为我有些申报,有句话让有回应,有福报,来自自身的老师郭立中,其实这词话很含关系之奥秘哦。我不用职业讲师,而仅仅是平等员肯终身学习,并且伴随而成长之总人口,所以我独自提有故事,和自家自己之片思考,供你做参考。您就当今天是同一个旧在茶馆里聊天吧。

登陆界面

是因为是类别简单而只发生一个人口付出(大抵人出以来,采用Storyboard不易于代码合并),加上Storyboard可以可视化的添加UI组件和Auto
Layout的封锁,并且可以预览多单例外分辨率iPhone的效果,极大地提高开发界面效率。

Login.png

今是自身首先堂收费的享用课程,既然是收费课程,我必得说干货,对得自而开的良9.99初次。如果你认为无值,分享成功后,你可问问我假若红包的。如果您当超值、也可打赏哈,这你决定!

登陆交互

登陆界面有Email输入框和密码输入框,当用户选中其他一个输入框时,左边对应的图标变成蓝色,同时会发生pop动画表示用户准备而输入内容。
当用户没有输入有效的Email或密码格式时,用户是无可知点击登陆按钮,只有当用户输入有效的邮件与密码格式时,才会点击登陆按钮。

Login.gif

咱们得动用RAC透过监听Text
Field的UITextFieldTextDidBeginEditingNotificationUITextFieldTextDidEndEditingNotification的通告来处理用户选中Email输入框和密码输入框时改变图标与出示的卡通片。

#pragma mark - Text Field notification
- (void)textFieldStartEndEditing
{
    // Respond to when email text start and end editing
    [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UITextFieldTextDidBeginEditingNotification object:self.emailTextField] subscribeNext:^(id x) {
        [self.emailImageView animate];
        self.emailImageView.image = [UIImage imageNamed:@"icon-mail-active"];
        self.emailTextField.background = [UIImage imageNamed:@"input-outline-active"];
    }];

    [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UITextFieldTextDidEndEditingNotification object:self.emailTextField] subscribeNext:^(id x) {
        self.emailTextField.background = [UIImage imageNamed:@"input-outline"];
        self.emailImageView.image = [UIImage imageNamed:@"icon-mail"];
    }];

    // Respond to when password text start and end editing
    [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UITextFieldTextDidBeginEditingNotification object:self.passwordTextField] subscribeNext:^(id x) {
        [self.passwordImageView animate];
        self.passwordTextField.background = [UIImage imageNamed:@"input-outline-active"];
        self.passwordImageView.image = [UIImage imageNamed:@"icon-password-active"];
    }];

    [[[NSNotificationCenter defaultCenter] rac_addObserverForName:UITextFieldTextDidEndEditingNotification object:self.passwordTextField] subscribeNext:^(id x) {
        self.passwordTextField.background = [UIImage imageNamed:@"input-outline"];
        self.passwordImageView.image = [UIImage imageNamed:@"icon-password"];
    }];
}

当点击登陆按钮后,客户端向服务端发送验证请求,服务端验证了账户与密码后,用户就是可成功登陆。所以,接下要了解RESTful
API的基本概念和Designer News提供的RESTful API。

     
不过自己是好有信念之。这从课程可以说凡是珍稀的,因为就是相同集市中心与内心,思维以及思考的交流,不是金钱就是得衡量的!

Designer News API

好了,言归正传,不克顶多废话了。

RESTful API基本概念和计划性

REST全是Representational State
Transfer,翻译过来就是见层状态转化。要惦记的确清楚她的义,从几独至关重要字入手:Resource,
Representation, State Transfer

  • ##### Resource(资源)

资源就是网及的实体,它可是仿、图片、声音、视频或者同种服务。但网络有这么多资源,该如何标识它们为?你得用URL(统一资源定位符)来唯一标识和一贯它们。只要取得资源对应之URL,你尽管可拜它们。

  • ##### Representation(表现层)

资源是一律种信息实体,它发多意味着法。比如,文本可以用.txt格式表示,也可据此xml、json或html格式表示。

  • ##### State Transfer(状态转换)

客户端访问服务端,服务端处理终结晚赶回客户端,在这进程遭到,一般都见面挑起数据状态的改变或转移。
客户端操作服务端,都是经过HTTP协议,而在此HTTP协议中,有几乎独动词:GET,
POST, DELETEUPDATE

  • GET表示收获资源
  • POST表示新增资源
  • DELETE代表去资源
  • UPDATE表示更新资源

理解RESTful核心概念后,我们来概括了解RESTful API设计以便可以看懂Designer
News提供API。就将Designer News获取Stories对诺URL的一个事例来证实:
客户端请求
GET https://api-news.layervault.com/api/v1/stories?client_id=91a5fed537b58c60f36be1sdf71ed1320e9e4af2bda4366f7dn3d79e63835278

服务端返回结果(部分结实)

{
  "stories": [
    {
      "id": 46826,
      "title": "A Year of DuckDuckGo",
      "comment": "",
      "comment_html": null,
      "comment_count": 4,
      "vote_count": 17,
      "created_at": "2015-03-28T14:05:38Z",
      "pinned_at": null,
      "url": "https://news.layervault.com/click/stories/46826",
      "site_url": "https://api-news.layervault.com/stories/46826-a-year-of-duckduckgo",
      "user_id": 3334,
      "user_display_name": "Thomas W.",
      "user_portrait_url": "https://designer-news.s3.amazonaws.com/rendered_portraits/3334/original/portrait-2014-09-16_13_25_43__0000-333420140916-9599-7pse94.png?AWSAccessKeyId=AKIAI4OKHYH7JRMFZMUA&Expires=1459149709&Signature=%2FqqLAgqpOet6fckn4TD7vnJQbGw%3D",
      "hostname": "designwithtom.com",
      "user_url": "http://news.layervault.com/u/3334/thomas-wood",
      "badge": null,
      "user_job": "Online Designer at IDG UK",
      "sponsored": false,
      "comments": [
        {
          "id": 142530,
          "body": "Had no idea it had those customization settings — finally making the switch.",
          "body_html": "<p>Had no idea it had those customization settings — finally making the switch.</p>\\n",
          "created_at": "2015-03-28T18:41:37Z",
          "depth": 0,
          "vote_count": 0,
          "url": "https://api-news.layervault.com/comments/142530",
          "user_url": "http://news.layervault.com/u/3826/matt-soria",
          "user_id": 3826,
          "user_display_name": "Matt S.",
          "user_portrait_url": "https://designer-news.s3.amazonaws.com/rendered_portraits/3826/original/portrait-2014-04-12_11_08_21__0000-382620140412-5896-1udai4f.png?AWSAccessKeyId=AKIAI4OKHYH7JRMFZMUA&Expires=1459125745&Signature=%2BDdWMtto3Q10dd677sUOjfvQO3g%3D",
          "user_job": "Web Dood @ mattsoria.com",
          "comments": []
        },
  • 协议(protocol)
    用户以及API通信采用HTTPs协议
  • 域名(domain name)
    该尽可能部署至专用域名下https://api-news.layervault.com/,但有时候会愈发扩大为https://api-news.layervault.com/api
  • 版本(version)
    应该将API版本号v1放入URL
  • 路径(Endpoint)
    路径https://api-news.layervault.com/api/v1/stories代表API具体网址,代表网同样种植资源,所以不克起动词,只有采取名词来代表。
  • HTTP动词
    动词GET,表示从服务端获取Stories资源
  • 过滤信息(Filtering)
    ?client_id=91a5fed537b58c60f36be1sdf71ed1320e9e4af2bda4366f7dn3d79e63835278指定client_id的Stories资源
  • 状态码(Status Codes)
    服务器向客户端返回表示成功或破产的状态码,状态码列表请参考Status
    Code
    Definitions
  • 错误处理(Error handling)
    服务端处理用户要失败后,一般还归error字段来代表错误信息

{
    error: "Invalid client id"
}

自我第一咨询大家一个问题:

Designer News提供API

Designer News API
Reference提供依据HTTP磋商遵循RESTful设计之API,并且同意应用程序通过oAuth
2授权协议来获取授权权限来聘用户信息。

200多摆合计导图改变了自我哟?这句话的显要词是啊?

访问API工具

貌似的话,在写访问服务端代码之前,我都见面因此Paw(下载地址)工具来测试API是否有效;另一方面,用JSON文本保留服务端返回的数量,用于moco如法炮制服务端的劳动。至于为何用moco模拟服务端,后面会教,现在由此用户登录Designer
News
夫事例介绍如何使Paw来测试API。
俺们先行瞧Designer News提供访问用户登录的API

Designer News Login API.png

依据上述提供的音讯,API的门径是https://api-news.layervault.com/oauth/token,参数有grant_typeusernamepasswordclient_secret。其中usernamepassword在Designer
News挂号才会取,而client_idclient_secret欲发送email到news@layervault.com提请。使用Paw发送请求与服务端返回结果如下:

New Send Request.png

(请回答)

Moco模拟服务端

Moco举凡一个可轻松搭建测试服务器的家伙。

对呀,是更改、是思考导图、也许是。。。。

为什么用效法服务端

作为一个动开发人员,有时由服务端开发进度慢,空有一个iPhone应用可发表非发意向。幸好有了Moco,只待配置一下伸手和归数据,很快便好搭建一个仿服务,无需等待服务端支出完成才能延续支付。当服务端完成后,修改访问地址即可。

偶然服务端API应该是什么法都还不曾掌握,由于来矣moco模拟服务,在付出过程被,可以不停调整API设计,搞明白真正好想只要之API是什么样子的。就这么,在服务端代码还没有当真动手前,已经提供平等份真正满足好索要的API文档,剩下的饶提交劳务端照着API去贯彻即行了。

还有一样栽情形便是,服务端已经写好了,剩下客户端还无成功。由于moco是地面服务,访问速度比较快,所以经动用moco来模拟服务端,这样不但可提高客户端的访问速度,还加强网络层测试代码访问速度的稳定,Designer
News就是这样情况。

咱率先来聊天改变,我眷恋说说自己之变动吧

什么运用Moco模拟服务

安装

而你是运Mac或Linux,可以品尝一下步骤:

  1. 确定你安装JDK 6以上
  2. 下载脚本
  3. 管其座落你的$PATH路径
  4. 安装它可以推行(chmod 755 ~/bin/moco)

现在公可运行一下指令测试安装是否成

  1. 编制配置文件foo.json,内容如下:

[
      {
        "response" :
          {
            "text" : "Hello, Moco"
          }
      }
]
  1. 运行Moco HTTP服务器
    moco start -p 12306 -c foo.json
  2. 开辟浏览器访问http://localhost:12306,你扭曲看见”Hello, Moco”

布局服务

由有上服务端返回的数量比多,所以将服务端响应的数目独立在一个JSON文件中。以登陆为条例,将数据存放于login_response.json

{
    "access_token": "4422ea7f05750e93a101cb77ff76dffd3d65d46ebf6ed5b94d211e5d9b3b80bc",
    "token_type": "bearer",
    "scope": "user",
    "created_at": 1428040414
}

要以请求uri路径,方法(method)和参数(queries)等布置在login_conf.json文件中

[
  {
    "request" :
      {
        "uri" : "/oauth/token",
        "method" : "post",
        "queries" : 
          {
            "grant_type" : "password",
            "username" : "liuyaozhu13hao@163.com",
            "password" : "freedom13",
            "client_secret" : "53e3822c49287190768e009a8f8e55d09041c5bf26d0ef982693f215c72d87da",
            "client_id" : "750ab22aac78be1c6d4bbe584f0e3477064f646720f327c5464bc127100a1a6d"
          }
      },
    "response" :
      {
        "file" : "./Login/login_response.json"
      }
  }
]

无知道发生没有发生在意到上面uri路径不是都路线http://localhost:12306/oauth/token,因为商默认是http,而且一般运行于本机localhost,所以在开行拟服务经常只待点名端口12306纵然实行。想越详实摸底哪些安排,请查阅官网的HTTP(s)
APIs
还有一个得安排地方便是,由于实在开发中毫无疑问不止一个客户端请求,所以还用一个配置文件settings.json来含有很有请。

[
    {
        "include" : "./Story/stories_conf.json"
    },
    {
        "include" : "./Login/login_conf.json"
    },
    {
        "include" : "./Story/story_upvote_conf.json"
    }
]

启航服务

拿路径跳反至DesignerNewsForObjc/DesignerNewsForObjcTests/JSON目录,找到settings.json文件,使用命令执行来启动服务:
moco start -p 12306 -g settings.json

=====

动Paw验证是否安排成功

Send request to Local Server.png

一、改变

1、身体达到之转移

自家曾是一个84公斤重的宝妈,在一个半月份前,我要么71.7公斤,但是本我一度63.3公斤了。在上个月,我减了8斤多之脂肪,我每天得无难于的笔录自己的餐饮现象,然后分享当简书,这一切对于一个于人及异常疲惫的食指的话,您看神奇呢?感觉是一个偶发吗?

唯恐你会说,这发生何呀?我还50公斤为。是呀,您的轻重是怪容易,也或好正常。但是于一个几十年胖子而言,您明白这起事会吃自己带多老大之意义感吗?

或许你会说若立即是小的,没有啊,你得会反弹之。是呀,这个题材,我关系好之同事也和自己说罢,不过我产生正挺好的束缚,有着伙伴等的支撑,再增长专业营养师(省干部休养所的沈医生)的技术,这种可能性还要发生稍许啊?再说自己而在乎微也?

我相信兴许还有一部分盖于大哥大面前的君,是习惯给鼓励别人的,其实确实就部分人数居多,说蓝心,哇,你好棒哦,分享一下方吧!是的,在4单月后,我会来具体做相关分享,到经常受时刻来报你周!

就是自己之首先独变化,人重量的更改,让自己自羽毛球时候又轻盈,身体不再有一样种植累赘之感。

作为使得开发(BDD)

2、情绪的转移

口产生不俗情绪以及负面情绪

正面的心气发生,开心、高兴、喜悦、自豪、兴奋等

负面的心怀发生难过、愤怒、绝望、压抑、骄傲等等

实际这是一个丁表现出来的不等状态。

人口且起正面情绪和负面情绪,只是于一段时间里,他亮正面情绪多一些或者少一些罢了。

比方自我原来是一个由当生和蔼可亲,脾气好之总人口,但是实际是一个平了好多心情的人口。

切莫知晓大家娱乐了DSIC性格分析也?如果没有打过,分享后,我会告诉你当什么去玩。最近正读了郭立中先生的初课程慧眼识人术,还当学习期,特别怀念尝试自己控制的技术哈,所以你们可来找我,我帮你开分析,然后给我有禀报,看看自己是不是生读心术?开玩笑啦!

事实上我是想念称,我表面上是和蔼可亲、脾气很好的考拉。世家领略考拉也?就是澳大利亚之国宝哦。所以一旦您测下了是特造袋熊,请不要看出啊坏。而如懂得他自身很有价,是国宝哈。

考拉型人是平栽老黄牛式的食指,工作早出晚归,一心为人家奉献,却甚少沾职场升迁。在家庭里呢是,一心围在妻儿服务,因为不见面保护好,极生或得的是平等堆积抱怨。卡拉型人是产生同粒玻璃心的,会觉得委屈,会哭泣,会感受及痛苦。所以只要您附近有考拉性格的人数,知道怎么与考拉型的人头处吧?

吁你善待她,因为它需要极高之安全感,它害怕,恐惧,受到惊吓。如果她需搬家的话,都急需其当半路,连在树一起移居哦,醒来时索要停止下来的,否则会遭遇惊吓之。

只是考拉型的格调的人口则发生众多痛在,但是只要觉醒,这将是同等股巨大的能量。因为痛苦带来教益,没有白受的惨淡,只要你能够转念,痛苦背后会让你带巨大的价值。

一旦你想正面情绪多于负面情绪的语句,可以省ABC法则,我产生于简书上享用应用思维导图来拆除情绪的地雷这本书。如果欲,我为得以开展这块的分享,比较可在家庭以及工作着屡遭委屈的宝妈哈。

这就是说自己的改动是啊呢?只说一样起吧!

于家园里,我不再是一个张在脸色的口矣,而变成了一个温柔喜悦的食指,类似于妻子的小太阳吧。我是跟公婆婆一起住的,已经闹10年了,大家知道和公婆婆同已,并无是十分爱的工作,前9年,我是因为一个戏谑快乐的人数,成功地变成了一个黄脸婆,连友好尚且未待见自己的口,这样的丁方可来好之心绪啊?但是经过这无异于年半的自己努力,特别是心理学领域的成材,我成了一个势必我,相对自信的口。

事实上当微课上,大家呢足以经过声音会断定自己之景象了咔嚓?大家为可错过听听当自己画完100布置合计导图里面的享用,也是当一道拟共好之荔枝直播中,你得听出明显得变化哦!

哼了,这是我以心态上的更改。

怎用BDD

非知情诸位在编排测试的时刻,有没发思想了一个题目:我该测试什么?要报是问题并无是那么简单,在并未获答案之前,你或继续按照你的想法编写测试。
-(void)testValidateEmail;
像这么的测试,存在一个向来问题。它不见面告诉你当会发啊,也非见面预期实际会发生啊。还有,当它有错误时,不会见唤起而当何来误,错误的因由是什么,因此而用深刻代码才能够亮失败的由来。这样尽管需要大量分外和免必要之体味负荷。
这时BDD出现了,帮助开发者确定该测试什么,它提供DSL(Domain-specific
language,
域特定语言),测试用例都以三截式Given-When-Then的叙述,清晰地发表测试用例是测试什么样的靶子要数据结构,在冲什么上下文或现象,然后做出什么响应。
因此,我们理应关注行为,而不是测试。那行为具体是啊?当您设计app里面的里目标时,它的接口定义方法及其依赖关系,这些方法和靠关系决定了公的对象如何和外对象交互,以及它们的意义是什么,定义你的目标的行为

其三、思维方面的反

不掌握哪位大神说罢,丁同食指里的异样在认知的歧异。而自以为用产生认知的反差,那是因想的逻辑层次或者想方法不平等。

今非昔比之人数考虑方法不雷同,看世界之角度为无一样。

刚刚实际生说个人、家庭、那我说说工作吧,做事但在之宝物,实现自我价值之利器嘿,所以,大家一定要妙干活。

2017年本身遇见一起十分费劲的作业。我面临着一个人生重要选择。选择是否用跳槽?你们了解不?考拉性格的口实际上是对合作社极有忠实心的,假如当一个店铺召开,会坚持以一个商行做下去,不管打骂,侮辱,折磨,他都见面于,除非你日渐地抽取它用之东西走,它认为有平等上没有东西得以打的下,它会倒。所以要你是公司之企业主,请善待他们,他们是中坚力量,公司之主力军。

实在对这之本身啊一致,而自骨子里还有其它一样段辛酸的故事,但是非便于于此说啊。我面临着只问题,当我们的店于外地搬的时光,我用漫长出差时,我应当怎么样选择?

差的食指是例外之思想方法的

片人说,纪云,走吧,在上海寻一卖工作,现在底火候多好呀,领导吃你钱让您走,30几近万,这种孝行哪里找?别傻了!

一些人说:家庭及事业哪个要?女人,有下才生事业,孩子是您的一体,做好一个妈妈。

一部分人说,公一旦失去了常熟,你的男女一旦用考不达标中学,到常你后悔生了!你会领这样的名堂呢?

为有人说,纪云,你抱做科研,你看,你叫商家开了那么多产品,现在同时是一个机,去时熟闯一千锤百炼吧,本人深信不疑,你得可以

其实还有不少种植想法,对诺在不同的思索方法,不过我怀念说的凡,他们暗中都是好因为爱自,所以给了自多深深的意。

若是我是怎么想的为?30大抵万底买断费,不思,那是在假装。如果30差不多万,厚厚的一折叠钞票摆在你的前方,你切莫见面双眼动一下?心里无念想在?当然为有权威哈,那是无一点点匮乏感的人数。

若果自我是平流,确实是触动的,说不动心是借用的。30几近万,相当给自己简单至3年之收入,而且还是未交税的。我当一个好人当然想拿。

但自还要格外纠结,我纠结什么吗?我能够出去找到好之做事呢?这里的同事领导都这样好,我走对得自她们也?我以及时同行业做了这么长年累月,有众多缠绵悱恻的经历,我白受了吗?这是平等种能力。来自心底的担惊受怕,当时自的妈妈吧面临类似抉择,她挑选了人家,结果后来径直郁郁寡欢,很无开玩笑。我心坎其实有一样栽常人难以理解的害怕在,我害怕,害怕像妈妈一样不开玩笑。于是我心里想选工作

倘除此以外一种植能力为?来自家庭,孩子,非常喜欢自愣住在外的身边,陪他成长,老公希望我当夫人看孩子,工作外为我毫无操心,他得以扶持我找找。公公婆婆其实呢盼自己当老伴,家里出个女主人在,这是大半好之业务哈。

自我有一段时间无法抵消这半种力量。我所有不知名的惨痛,无法清楚地解好的取向,我那个纠结,不知晓怎么去挑选。

为此我去矣新人才学习生涯规划,期望自己找到答案。我在网上报了许多微课,期待找到答案,我当现实生活中为以考察同事的挑,他们如何做的?也盼望由她们的随身找到答案。

这些我还尚未找到答案,而满似乎自己当罗先生的苦思冥想课程达到看的那样,我之前景同一切开迷茫。

自痛苦,抑郁,一段时间不明了怎样去发挥自己。

唯陪伴自己的只有是自己2016年碰到的初的欢喜,思维导图。我以考虑导图上勾下自己学的学科,我因此心想导图来赞助协调学车,我于是心想导图帮我调情绪。

当然我吗非常感谢所有的同伙等,无论是现实中的,还是网络中之情侣,当时本人说的,做的,是出来负面能量的,感谢你们的容纳和接。感谢那些网络上叫自身点赞的恋人,谢谢你们,知道呢?那个时刻是自我最脆弱的时节,你们的砥砺对自而言是何其的显要哈!

但本人坚持在,有考虑导图、断舍离、POA、等学科的陪同下,突然发一样项我得了答案。

自己是一个不好不坏的人头,我好允许自己开一个混蛋。我用了解自己,去哪里工作其实答案不以外围,在于自己的随身。

当我开始关心好经常,仿佛尽发生了答案。这个答案非常简短。

即时不是一个失去非去外边工作的问题,而是一个相思成为怎样的人数之题目。身的意思在成为您自己。我有什么的期呢?自己眷恋做氟化工行业之PTFE领域的大方为?如果你想,就留下来,为这个目标要奋斗,如果非思,有新的倾向也?如果既成熟,那便错过开
吧,实现和谐之微梦想吧。

自身静心地问我好,我思吧?我的心中的答案是自然之,我思念,非常想。因为自之办事十分有义,大家掌握不糊锅也?大家家里还发生吧?当2007年毒未粘锅事件闹得闹腾时,也许很多丁犹明白,甚至怀念拿老婆的锅子拿出来砸了,说非粘锅有毒!

实际上也,并非不贴锅有毒,而是生产过程中行使的同一栽试剂有毒,非常微量的,基本以200大抵过就讲的试剂。我们无说立刻波幕后的其它意思,我只有想说,我举行的做事暨各位家庭有关的,我梦想吃大家提供平等丁安全的环保的非糊锅,我耶直接为的直努力着,曾吃合作社付出有些许个系列之环保聚四氟乙烯乳液,共计8种产品。我呢出申请了8件专利技术,我之专利一度得到国家中国专利局之精粹专利奖证书

行事吃自家痛苦也?事实上痛苦并愉悦着是一个研发人员之实相。考拉型的研发人员相似不擅长沟通,喜欢蒙头做作业,所以会见时有发生那么些委屈在,但是她们见面蕴藏在眼泪把作业做截止,为了项目最后的目标,讲奉献,讲集体主义精神。

自也如出一辙。但是经过学习,我懂了不同之人口不同的思维方式,我一筹莫展更改别人对己的章程,但是本人得以调动自我对他人的法。我好错过押,去听,去考察,去探听您语言中真正的意思,从而能够重新好的联系。

个中办事遭到为产生好多坑,有工夫还受大家唠嗑哈。

面说之是本身当身体、情绪、思维方面的老三万分改变。

BDD过程

行事使开发大概三独步骤:

  1. 挑选最为要紧之一言一行,并编辑行为的测试文件。此时,由于测试目标的接近还不曾修,所以编译失败。创建测试对象的好像并编制类的暗实现,让编译通过。
  2. 实现叫测试类的作为,让测试通过。
  3. 设若发现代码中生再度代码,重构于测试类来驱除再

假使暂时未知底其中步骤细节,没有涉嫌,继续于下读,后面来例子介绍来帮助你懂三只步骤的意思。

有人会咨询,思维导图是啊?也说不定有人会咨询,你管什么说公的转来自于思考导图呢?思维导图学习来啊好处?我们欠怎么学思想导图呢?不知晓还起没出外的题目为?如果有,可以留言哈!我得线达还是线下解答。

登陆验证

次、思维导图是呀?

借思维导图一修被的定义

沉凝导图是因此图展现的同种发散性思维。发散性思维过程也就是大脑思维和发想法的进程。通过捕捉与表达发散性思维,思维导图将大脑里的历程进行了表表现。本质上,思维导图是在又和效仿发散性思维,反过来还要加大了大脑的本能,让大脑更强硬,更强劲!

眼看段于理论,我之理解是,思维导图是大脑的一个表面表现。用图形,文字,线条等措施将大脑的想法写出。

也就是说要你的大脑思绪是无规律的,自然而描有之图是乱而不要逻辑的。

如您的大脑是清晰的,自然是系统结构清晰可见的。

事实上就没什么,如果是乱的,恰恰思维导图能够帮忙而,由未清楚到清。

昨天本人之小伙伴阳光分享给自家她的盘算导图笔记

它问我,你道这个导图怎么样?是否出硌乱啊?

自立有说,其实想导图画出来,就是一个整大脑的历程,一开始是会混杂的,但是慢慢画,也就算哼了,你看其最后就的导图多硬呀。她是一个死有智慧的人头,背后用着心打底,中心图,是同等艘小艇,写在自悟自救,上面的风帆上写在三独重要内容,说实话,特别赞颂!

寻思导图更是均等种植心灵和良心的交流,因为每个图案对每个人之含义不相同的,如果同频的人头收看,会立马点出而开口的意思,这是基本上好的平栽看见哈。看见是人心底的如出一辙种基础需要。如果您受看到的愈加多,你越是会当受清楚,你的其他力量还自然而言地提升啦。

骨子里想导图又受心智图,这是产生道理的,应用了这样久确实是得感受及广大地方的晋级。

纱访问层

老三、思维导图怎么画?

骨子里这块原本不思讲,因为发伴(神的儿女于中途)有要求,所以有些说有大概的。

1、思维导图类型

思考导图有三好类,第一接近是全文字型思维导图,这相似用来职场受,信息量比较老,波音公司既就此到飞机的品类受到,节省了1千百万美元。第二像样是全图型思维导图,一般每张图像对两样之人口产生异的明,所以全图型的琢磨导图需要人来解释。第三好像是图文型的构思导图,这是最为常用之沉思导图形式。.

2、5只关键技术

5个关键技术是可视化的工具,放射性思维,关键词技术,逻辑BOIS,颜色管理,这几个关键技术是索要在其实过程被不止练习的,仔细回味的,这里以时间关系不举行分享。

3、怎么画?

3.1首先需未雨绸缪工具

工具要发生些许样,白纸和画。

一经新家练习,一般使用A4轻重缓急的白纸,完全空白的张可以促使大脑不深受其他约束的拓展思想,能鼓舞你无限的想象力。对了,如果想持续练习,可以准备同本素描本。这样可将具备的沉思导图放在一块儿,一方面,复习起来较便于,另一方面,画一段时间后,有几十摆设时,拿在剧本看,也起一样种植满的成就感。

画一般采用12成色、24质量和彩笔或者马克笔或者荧光笔。

倘以做事直达,只有黑笔和白纸,画黑色简图也是好的。黑色醒目,更契合人记得。彩色的导图会被丁同样栽美感,不同的颜料、图像在不同之人记库力代表正在不同的意,所以让导图增加有情调时,你会深感到均等栽诚心的乐趣。

理所当然,画导图的不过特别重要是:带达您的大脑与公的想象力!

3.2、动笔画

1)、用心想并绘出基本主题(类似于文章的中心问题):

闭上眼睛,用心想一下你想如果写的主题,结合是主题,你的大脑里会突显出怎样的绘画或文字。

譬如思维导图书上之鲜果主题,作者想到的是故一个篮子上面写在水果这有限单字来发挥

但若是就之自我,右脑就经费十分遥远了,那无与伦比简便易行的计尽管是把主题文字写下之后外画一个面。

以张的为主画生你心里面想画的图形

白纸横放,在白纸的核心岗位画大小长宽约5厘米的图像。

2)画主干:

基本是自从基本主题延伸出的几乎长条分支,是异常之归类,类似于写篇时之十分题。主干线条要稍微,需要肯定的曲线,由小及细。

主导的画法可以好统筹,在小线条的里填上温馨喜好的情调和画画。

构成水果的主题,你会想到什么吗?也许是橙子、苹果,香蕉,樱桃或者其他?

画画思维导图,一般是自右侧上比的道岔开始,然后按照顺时针的方向画。当然也出逆时针方向打的,这个是因人而异的。这里呢时有发生一个有些之注意点,主干需要紧密连接中心图,这代表着思想和基本主题精心相关,是一律栽放射性的构思。

3)画支干:

支干是从着力延伸出的,是略之归类(类似于写篇时之有些题目)。支干线条要细于主干。

支干一般是一条条的作画。比如说水果导图上的苹果,他联想到之医生、夏娃、馅饼、蛇朝一个娘子吐性子?这是表示什么?诱惑?可能两样之丁闹差的明白。

4)填写关键词

因你联想到的物,我们于中心和分线条的上面刻画上想到的要词,从各国一个重要词(医生)发散出还多的子(走开)。分支的数码在你所想到的物之多少。这里用小心的凡骨干和分中有着不同层次的逻辑关系,需要持续练习,才得以升官。

一言九鼎词的提取也急需特别注意。关键词一般也名词、动词、形容词,在思维导图上急需尽可能简洁。

于线条上,尽量按照相同丝一致乐章。每个独立的辞藻都发上千只或的联想,每条线上一味写一个歌词回被您带来联想之肆意。起一样句话给,一线一样词,思想自由

5)在揣摩导图上上上你爱的情调和从属的记忆标签

诸如此类同样轴关于水果之思考导图就打好了。其实想想导图的画法还是蛮简单的,一共有五只十分的面,分别是骨干主题,线条(主干、分支)、文字(关键词)、图像、颜色。

DesignerNewsURL

DesignerNewsURL仿佛包装网络访问URL

#import <Foundation/Foundation.h>

extern NSString* const baseURL;
extern NSString* const clientID;
extern NSString* const clientSecret;

@interface DesignerNewsURL : NSObject

+ (NSString*)loginURLString;
+ (NSString*)stroiesURLString;
+ (NSString*)storyIdURLStringWithId:(NSInteger)storyId;
+ (NSString*)storyUpvoteWithId:(NSInteger)storyId;
+ (NSString*)storyReplyWithId:(NSInteger)storyId;
+ (NSString*)commentUpvoteWithId:(NSInteger)commentId;
+ (NSString*)commentReplyWithId:(NSInteger)commentId;

@end

这边还来只技术就是是于DesignerNewsURL.m落实文件发出只条件编译,判断是在测试环境还是产品环境来决定baseURL的值,可以老方便于测试环境与制品环境相互切换。

#ifndef TEST
NSString* const baseURL = @"https://api-news.layervault.com";
#else
NSString* const baseURL = @"http://localhost:12306";
#endif

NSString* const clientID = @"750ab22aac78be1c6d4bbe584f0e3477064f646720f327c5464bc127100a1a6d";
NSString* const clientSecret = @"53e3822c49287190768e009a8f8e55d09041c5bf26d0ef982693f215c72d87da";

季、思维导图有什么用?

寻思导图其实是一个工具,代表正若大脑内的想法。如果您左右了它的基本画法,可以用来你待的别样场合。

也就是说,你发出啊,就得据此当何。因为其实质上是个大脑想法的一个表面表现。

好为此来读,写作、可以就此来定制年度计划,可以用于旅游之景点导游词的梳理。

就是得组成自己的用去扩大的。

当你用于读书时,可以帮忙您快阅读,记忆。

当您烦时,你得用于自的心境梳理。

当您出行旅游时,可以为此思想导图整理导游词,或者做当下之景况去梳理需要记忆之情节。

当您做项目时管理,一摆放合计导图可以为您纵观全局。

它们的便宜莫过于你不用质疑,通过不停练习,你自己履行后可以慢慢发现。

产生同句话给闹因此才见面起因此(郭立中先生名言)

分开享案例1:思维导图记住导游词

享受一个要命有趣的例子吧。

产生同不行我们带孩子错过南京的中山陵玩,目的是梦想子女在嬉戏的同时,对革命历史及博爱、三民主义等专有名词有自然的问询。去之前,我下载了一如既往首导游词,准备带及景观,边看边叫子女说话。

在列车上,我看了转导游词,内容十分多,好几页纸,有接触看了前头忘了后边的发。于是我起背包里拿了千篇一律张纸,整理了一下思路,画一布置简易版的思导图,帮助自己清楚,记忆。

通过边写边打,读完导游词后觉得思路清晰多了,知道中山陵凡孙中山先生安葬的地方,了解怎么孙中山先生会选择以这安眠,他的重点考虑是啊;中山陵底设计者是何人,为什么这样设计?中山陵是因为产生什么有构成,上面又来哪有趣的故事。

简而言之的想想导图

第二龙带娃去中山陵不时,一起奇怪之政工来了,我忘记了带导游词,心里多少大。不过既然事情发生了,埋怨自己从未啥用哈,只能想法子去化解。想在想在,脑海里冒出了那张思维导图,虽然很LOW,但是80%内容本身还记,我报告儿子怎么墓道两旁无是石像,而是雪松。是盖松树生命力强,不屈不挠,象征着孙子先生的高尚品质以及变革精神。为什么是392单阶梯,因为这暗喻了就发生3亿9千2百万之同胞。

新兴自家将当时档子事喻了郭立中先生,他道以前为时有发生相近的痛感,建议我分享下,并且被自身失去他的思想导图群复训。那是自先是涂鸦发现思维导图,原是如此有趣之事务!

案例2,将思想导图用于断舍离课程上

我倍感思维导图很好地诠释了绝对、舍、离

断舍离原是日本人山下英子提出的同栽现在非常流行的家居整理方法。曾有平等总理韩国影片“怦然心动的整治魔法”讲述了一个女性职员通过整治间从而整理好人生之故事。 
     
断舍离包括三只有,舍(识别不欲,不爽快),心里亮堂我不用啊;断(专注于这):表明自身若什么,集中精力干啊;离:怎么卖力达到这个目标。

       
使用思维导图来读书要举行速记时,首先会见放弃去不待之一些,留下好感觉要之部分,当整张思维导图完成时,我们会发觉读书或记笔记的目的都高达,同时也记住了你用上学之始末。

若您用于断舍离课程学习时为是平啊。记录转在世着的光明。

当打开这张合计导图时,我的思路仿佛这穿越至了2016年7月22日那么同样天。在美之三合院,我赶上了和蔼可亲的來永旭先生,遇上了伙伴ELian。她是千篇一律称作把做思考导图的师长,晓茜同各项心理咨询师,会对面识人术的ANNA,做妈妈又出发平台的能妈,LISA埃里克森的教练,幽默风趣的东霞,会玩塔罗牌的丽英,佛缘的Monika,非常便于家的唯一可以哥哥張郡泽,和本人同一期待疗愈成长的SHE-RA.很多丽的故事以咱们中来了,我第一次于感受及了心理学的能力,有相同种植做得了了心灵SPA的觉得

当此自己发觉了本人的力量,我非常感谢我的教工來永旭先生,他被了诸多先是不行,第一不行线及分享,第一不善受自身伙线下沙龙活动,后续会发生第一涂鸦做培训师,还有为数不少其它地方。他启发我,让我连地追许多人生的可能性。

返导图这块,其实这张导图很初级,是本身的第十二张导图,有几稍的症结,不过没什么,挺好之,一张真实的笔录。

首先看,中心图,一单单蚕蛹化了蝶。代表着自己锐变,唯一的行程是易自己,通过断舍离,实现内在成长。

副看分支:一般的分段是自从右边上比开始看之,來永旭先生,活动之领队、遇上的丁,学到之计、怎么开?为什么来因此,断舍离是什么?其实打即张图的逻辑结构及看,当时的逻辑是于粗放的,点还在,但是点和点之间的逻辑关系有些不足。不过记录下来就好。人口好没有完美起来,但是
开始了,就会渐渐转移好之。

案例3、将思想导图用于POA课程上

网友经常说,蓝心,你为何可以产生那么好之行动力呢?

实在秘密在于POA课程的修。

实质上非常感谢橙子学院此平台,我的更改始于是起这平台来的,古典老师是均等各项生涯规划师,在获取上发生最佳个体专栏。

受上朱颖磊先生是盖橙子学院琼咪举办的等同浅线下走。课程价格异常公益,几十块钱,喝相同杯咖啡的钱。朱颖磊先生是如出一辙各类从500大公司里之高管,转行到培训师,现在以在培训培训师的办事,他的生涯经历非常丰富,让我肃然起敬的凡,他真实。

世家发出没有发出发现,我遇上的师基本都是老公益的师长,郭立中先生,來永旭先生,还有朱颖磊先生,后面赶上的琢磨导图的Elian、陌上花开、冥想师罗春娟还起发生正在大爱之尔玛先生,等等伙伴及爱人,其实她们出一个特色,吸引自己的性状,公益、助人。

这些深入地引发着自身。引领我走向一个公益之动向。

POA其实是一个公式,是均等栽沉凝方法

加强行动力的义,从数学公式上看消聚焦目标(少),给力的伴儿(多)和章程(多)。

及时节课除了说了哪增强行动力外,还有关于亲子教育同亲密关系相处之秘方,如果谢兴趣,可以好看这张合计导图哈。

行为令开发LoginClient

于编辑代码之前,我们应先想想如何统筹LoginClient好像。首先根据Single
responsibility
principle(责任单一原则),LoginClient关键承担用户登录的大网访问。需要提供一个接口,只要加用户称(username)和密码(password),用户就是可知登录,由于自是以RAC来拍卖回来结果,所以是接口返回RACSignal对象。

  • 创办一个LoginClientkiwi文件,编写对应行为。

Create LoginClient 1.png

Create LoginClient 2.png

SPEC_BEGIN(LoginClientSpec)

describe(@"LoginClient", ^{

    context(@"when user input correct username and password", ^{
      __block RACSignal *loginSignal;

      beforeEach(^{
          NSString *username = @"liuyaozhu13hao@163.com";
          NSString *password = @"freedom13";
          loginSignal = [LoginClient loginWithUsername:username password:password];
      });

      it(@"should return login signal that can't be nil", ^{
          [[loginSignal shouldNot] beNil];
      });

      it(@"should login successfully", ^{
          __block NSString *accessToken = nil;

          [loginSignal subscribeNext:^(NSString *x) {
              accessToken = x;
              NSLog(@"accessToken = %@", accessToken);
          }error:^(NSError *error) {
              [[accessToken shouldNot] beNil];
          } completed:^{
              [[accessToken shouldNot] beNil];
          } ];
      });

    });
});

SPEC_END

因三段式Given-When-Then讲述,上面代码我们得以知晓啊:在叫定LoginClient对象,当用户输入是的用户称及密码时,应该登录成功。
这儿,由于还并未创建LoginClient接近,所以会见不经过编译,创建LoginClient类似,并编制它的伪实现,让LoginClientSpec.m经过编译。

LoginClient.h.png

LoginClient.m.png

运行测试,测试失败。

LoginClient Failed.png

  • 心想事成LoginClient,通过其测试

LoginClient.m .png

LoginClient Pass Test.png

  • 由于无冗余代码,无需重构

五、常见的题材

1、我掌握乃作画的导图挺帅的,我非会见画画,所以自己无见面写;

事实上自己吗从不画基础,以前看打的人口,可看不务正业了,可是当我好开画基本图后,我意识虽然自己画的不好,挺丑,但是自好享受这种画画的发,一种植轻松欢快的痛感。

本身打后,才懂原来描绘是这么地佳!

骨子里我们当人生中,特意爱我设限,别人好狠心,本身无学了,所以自己无见面。我从不大天赋,所以自己弗见面。只是用羡慕的视角看正在别人。

实则当您起来了,狠心做了,你发觉,一切不难,而且你来坚决的目标时,整个世界还见面协助您。这为自家回忆了安琪的学习力一题第二章节里的如出一辙句话。只要您真的努力地走,全世界都见面否汝让步!

2、思维导图是写于协调拘留的,不是他人。

发出成千上万群友,特别相信自己,会管其底第一张合计导图发给自己看。特别感谢他们之信任。

相似自己还见面咨询其一个问题,这张导图是若要之啊?解决了而的问题啊?在画导图的历程你看开心啊?如果是公需要的,也能够通过这法子梳理情绪,或者记住了有事物。那便是好的导图。导图是给协调拘留之,不是他人。当然如果你的导图是用于工作汇报时,那是要考虑别人的急需的。

3、软件好或手绘好吗?

这题目重重人口咨询我。我直接感觉各有优势。软件版本,是当网直达写的,字是计算机的许,不会见含有自己之觉得。但是排版清晰,可以改,适合网络分享。特别是东尼博赞的法定版更好。可以多人数合作,更发出甚者,可以一直跟WORD,PPT相连接,做好导图后,可以一直分享。不过这些是收费软件,目前,我们需要根据自己之需求来。普通的Xmind,百度脑图都得满足我们一般人的需了。

手绘思维导图,在于创意无限,与己连接比大,这凡自己之,独一无二的导图

虽说写得比较缓慢,但是因有手的插足,更能锻炼大脑。在描绘的长河被,专属的记得符号,线条上之留白,画画给你的自由自在的发,这是计算机无法取代的。这是本人喜欢手绘的来头之一。

实则,软件及手绘版各发长处,并发出相关性。我早已见了自家之姐妹陌上花费开教职工,将软件版本思维导图和手绘导图放在同样摆图及,很好地接连了软件版和手绘的导图。但是达老师的水准要不停的练哈。

4、我们怎么开始学思想导图呢?

读思考导图有无数措施,找到符合自己的不二法门极其着重。

A、如果你的逻辑思维能力足够好,读东尼博赞的思维导图,这仍经典读物足够了。

而且用逐字阅读频读,我念了2布满,收获颇可怜。

B、线上或线下报班学习,市面上发诸多课程哈,唯一专注的凡开端建议就东尼博赞的管理师或者认证师学习,因为市场上起为数不少名师并无明白思维导图到底是什么,容易把学生带偏。

5、学习思想导图有安注意点?

考虑导图是同等宗技术课,不是知识性课程,并无是说上平等节课就足以搞定的,其实用长期坚持不懈、刻意练习,才足以知道其的利益。

在座其他一个社群都是得的,只要来一样多样的同频伙伴在,互相支持就可以

实际上就是仿照任何一样派技术的神速学习道吧,在一个针锋相对安全的长空里,这时候的平安是这场域是可以让人所接收的,你所举行的,无论是好之,或者是糟糕的,都可以被看见,被接。在如此的条件下,你尽情地做自己嗜的事体,受到别人的必定与夸赞,当然同时为会见生出指导。

诸如此类的法会非常抱学习。至少可考拉型的我去上,提升。我是郭立中先生的沉思导图课程的次要学员,目前已是第八想了,每次直学员还是足以免费到复训的,我每任一不成,对想导图又出例外的懂得,这样就坚持1年半了,今天之反馈也终于一街学习总结吧,也可以是2017年之东学习总结了。

Model层

由这次登陆请求服务端返回数据比较简单,只是获得access_token许段数据,所以无需要model来照和贮数据。不过当获取多独Stories时,就会使到model来拍卖。

感谢

自我异常感谢自己之构思导图郭立中先生,是当集团党校的相逢,让我知道了这样一个简练的上工具,我吧需感谢自己之不竭,一步步地坚持,让自己的档次思维与垂直思维得到一步步地展开,随着和心理学的组成,得到了心智方面不大提升。

谢我之断舍离來永旭先生,您一次次拓宽了自之本人界限,引领我向着未知领域去追前实施

谢POA的朱颖磊先生,您的特之思想方法,让自己越有矣行动力,也非常感谢您课程达到关于人生之分解,让我在亲密关系上闹矣好要命之上进

谢谢我的好姐妹Elian和陌上花起,是你们管我是开心还是痛苦,都好及时听自己倾诉,给自身安慰和适量的鼎力相助;

感谢尔玛先生,您的大爱和收取程度是自个儿所倾倒的,您第一单享受了自之团,大力帮助自己放微课,在心理群里鼓励我,让自己痛快自由地帮人家;

再度得感谢我之伴儿等,是你们老的陪同,让自家中见了一个实打实的团结。

突然发现自己还同差忘记了开自我介绍:

事实上,你就需要记住自己是一个甘当终身陪伴你学习成长的人,知道为什么2018年1月13日分享呢?因为13表示在终身。我欲一生陪在公。

自家于2018年具有一些微梦想,也许你看罢自己之情侣围,您为堪解,也可还原帮助自己实现

本身今年会做有公益活动,其中同样码是应用思维导图拆解佛学书籍,其实就源于想帮朋友Elian,因为它喜欢佛学,以想导图的章程来帮忙别人。我本想拆3按照,但是出于特定的姻缘变成了10差不多遵照,我中见了法师,听了他关于正念的解读,遇上了一些居士,听他们说佛学如何转了存。我弗理解,所以会学,会体会,会掌握。在宣读之率先本书禅与新意,有这样一个故事:

在美国之加州,有同等栽树木被红杉树,红杉树是社会风气上能长得高的植物,一株树能长到90米,大家表现了呢?30层楼的惊人,这株树该起差不多高啊,有些人恐怕会见咨询了,你看能长这么高之植物,它的彻底一定扎得大特别大十分吧,其实加州之红杉树,它是浅根型的植物,它的根扎得并无殊,那么为什么狂风暴雨来之时节,这粒红杉树不见面倒呢,因为红杉树有一个性能,就是密集的丰富于共,长成一片森林,在地底下,它的清虽然长得不特别,但是当地底下,它们是互的彻底就会见紧紧相连,就会形成一片根的纱,除非是狂风暴雨,大至可以掀开整个地面,否则没有一样株红杉树会倒下,这个优势于乌吧?因为不用扎太非常的到底,所以红杉树能够以札根的那些能用来前进伸展,而且还能还方便,更敏捷,更大气的吸收养分,这便是他俩能长得专程强的机要原因之一,

同一的,我们同频的伴等,我们为使像它同,我们可相互支持,来连成一片生命之根之纱。我们且是小人物,我们得相互支持,互相帮,共同进步,一起成人,共拟共好!

继承共拟共好直播间会推出系列公益课程,希望大家基本上享受自己之学习心得体会,携手同成长。

持续公益之享用:

网友A.sunshineHJX 分享:非暴力沟通的就学体会

网友心理学老师麦大大分享:积极心理学在生活中的使

以西安漫游遇见的社宣部兵马俑讲师张晓暮来分享:兵马俑和铜马车的故事(了解一下史文化)

再多公益分享等正您来申请哈!

更多运动要关注

脚下民众号里一片空白,我们的前程,等待我们一并错过创造!欢迎你同来打!

自家深信不疑相信的力量,一切是极致好的部署,

今天之享用到此结束,十分感谢你的聆听!祝大家晚安!

Controller与ViewModel层

controller凡是处理用户交互的输入,通常自己都见面将拍卖用户交互的逻辑、数据绑定和数据校验都付出ViewModel来精简controller代码,同时最老程度地复用业务逻辑的代码。
我们先想起用户登陆时的步调:1.
用户优先输入email和密码,只有email和密码可格式要求时才能够点击按钮。2.
用户成功登陆后,跳反到故事列表主页。
咱俩先分析一下哪实现步骤1,
想使对email和密码进行认证,必须要监听它们简单只价的扭转,所以用针对emailTextFieldpasswordTextField使用RAC进行多少绑定。

创建LoginViewControllerSpeckiwi文件,测试绑定行为代码如下:

SPEC_BEGIN(LoginViewControllerSpec)

describe(@"LoginViewController", ^{
    __block LoginViewController *controller;

    beforeEach(^{
        controller = [UIViewController loadViewControllerWithIdentifierForMainStoryboard:@"LoginViewController"];
        [controller view];
    });

    afterEach(^{
        controller = nil;
    });

    describe(@"Email Text Field", ^{
        context(@"when touch text field", ^{
            it(@"should not be nil", ^{
                [[controller.emailTextField shouldNot] beNil];
            });
        });

        context(@"when text field's text is hello", ^{
            it(@"shoud euqal view model's email property", ^{
                controller.emailTextField.text = @"hello";
                [controller.emailTextField sendActionsForControlEvents:UIControlEventEditingChanged];
                [[controller.viewModel.email should] equal:@"hello"];
            });
        });
    });

    describe(@"Password Text Field", ^{
        context(@"when touch text field", ^{
            it(@"should not be nil", ^{
                [[controller.passwordTextField shouldNot] beNil];
            });
        });

        context(@"when text field' text is hello", ^{
            it(@"should equal view model's password property", ^{
                controller.passwordTextField.text = @"hello";
                [controller.passwordTextField sendActionsForControlEvents:UIControlEventEditingChanged];

                [[controller.viewModel.password should] equal:@"hello"];
            });
        });
    });
});

SPEC_END

此间来少独重点点,一个是从Storyboard中加载controller,否则不克赢得emailTextField和password,如果采取手写UI代码就未需要了。另一个哪怕是emailTextField或passwordTextField必须调用sendActionsForControlEvents:UIControlEventEditingChanged艺术,才会触发textField的text属性改变。

编译失败后,在LoginViewController.m编写- (void)bindViewModel方法通过测试

RAC(self.viewModel, email) = self.emailTextField.rac_textSignal;
RAC(self.viewModel, password) = self.passwordTextField.rac_textSignal;

贯彻得了数据绑定行为后,接下去要多少校验,交给LoginViewModel来处理。创建LoginViewModelSpec.m文件,提供emailpassword属性给LoginViewModel,返回验证结果的RACSignal,测试证明行为代码如下:

SPEC_BEGIN(LoginViewModelSpec)

describe(@"LoginViewModel", ^{
    // Initialize
    __block LoginViewModel *viewModel;

    beforeEach(^{
        viewModel = [[LoginViewModel alloc] init];
    });

    afterEach(^{
        viewModel = nil;
    });

    context(@"when email and password is valid", ^{
        it(@"should get valid signal", ^{
            viewModel.email = @"liuyaozhu13hao@163.com";
            viewModel.password = @"123456";

            __block BOOL result;

            [[viewModel checkEmailPasswordSignal] subscribeNext:^(id x) {
                result = [x boolValue];
            } completed:^{
                [[theValue(result) should] beYes];
            }];
        });
    });

    context(@"when email is valid, but password is invalid", ^{
        it(@"should get invalid signal", ^{
            viewModel.email = @"liuyaozhu13hao@163.com";
            viewModel.password = @"1";

            __block BOOL result;

            [[viewModel checkEmailPasswordSignal] subscribeNext:^(id x) {
                result = [x boolValue];
            } completed:^{
                [[theValue(result) shouldNot] beYes];
            }];
        });
    });

    context(@"when password is valid, but email is invalid", ^{
        it(@"should get invalid signal", ^{
            viewModel.email = @"liuyaozhu";
            viewModel.password = @"123456";

            __block BOOL result;
            [[viewModel checkEmailPasswordSignal] subscribeNext:^(id x) {
                result = [x boolValue];
            } completed:^{
                [[theValue(result) shouldNot] beYes];
            }];
        });
    });
});

SPEC_END

编译失败后(已经创办LoginViewModel类),添加- (RACSignal*)checkEmailPasswordSignal连落实认证数据,通过测试

- (RACSignal*)checkEmailPasswordSignal
{
    RACSignal* emailSignal = RACObserve(self, email);
    RACSignal* passwordSignal = RACObserve(self, password);

    return [RACSignal combineLatest:@[ emailSignal, passwordSignal ] reduce:^(NSString* email, NSString* password) {
        BOOL result = [email isValidEmail] && [password isValidPassword];

        return @(result);
    }];
}

最终要在LoginViewModel缔造属性也loginButtonCommandRACCommand来拍卖点击登陆按钮的交互。在LoginViewControllerSpec.m测试loginButton.rac_command无能够吧空

describe(@"Login Button", ^{
      context(@"when load view", ^{
            it(@"should be not nil", ^{
                [[controller.loginButton shouldNot] beNil];
            });

            it(@"should have rac command that not be nil", ^{
                [[controller.loginButton.rac_command shouldNot] beNil];
            });
      });
 });

测试失败,在LoginViewController.m编写- (void)bindViewModel道以下代码有

self.loginButton.rac_command = self.viewModel.loginButtonCommand;

LoginViewModel.m延初始化loginButtonCommand属性

#pragma mark - Lazy initialization
- (RACCommand*)loginButtonCommand
{
    if (!_loginButtonCommand) {
        _loginButtonCommand = [[RACCommand alloc] initWithEnabled:[self checkEmailPasswordSignal] signalBlock:^RACSignal * (id input) {
            self.active = YES;

            return [[LoginClient loginWithUsername:self.email password:self.password] doNext:^(NSString *token) {
                self.active = NO;
                // Save the token
                [LocalStore saveToken:token];
                // Dismiss view controller and fetch data, reload
                self.dismissBlock();
            }];
        }];
    }

    return _loginButtonCommand;
}

由此测试,完成登陆基本流程,至于登陆成功后什么回到故事列表页面,这里不详细介绍,各位可由此阅读工程代码即便得以得到答案。

总结

近来一段时间都重复看有关敏捷开发的书(用户故事以及快方法,硝烟中的Scrum和XP,
剖析极限编程),对迅速开发很感兴趣,但意识很少公司还是博客介绍如何尽敏捷开发iOS,所以在网上收集一些材料,发现产生好多绝妙的实践(测试驱动开发,重构,持续集成测试,增量设计,增量计划)值得去上,通过协调对快开发中各种实践的明来重新写是Designer
News,这个Designer
News功能还尚未尽得,希望各位看罢这首稿子尝试以如此方式来完成全部app。如果自身稍稍意见还是施行理解有无意,请各位多多点。

推而广之阅读

  • ReactiveCocoa
    ReactiveCocoa –
    iOS开发之初框架
    ReactiveCocoa2实战
    ReactiveCocoa Essentials: Understanding and Using
    RACCommand
    Test with
    Reactivecocoa
  • Kiwi
    TDD的iOS开发初步与Kiwi使用入门
    Kiwi 使用上阶 Mock, Stub,
    参数捕获和异步测试
  • RESTful API
    理解RESTful架构
    RESTful API
    设计指南
    理解OAuth
    2.0
    SSL/TLS协议运行机制的概述
  • Moco
    Moco能集成测试,还能够移动支付;能前端开发,还能学Web服务器!
  • 测试
    作为使开发
    XCTest
    测试实战
    拄注入
    坏之测试
    换成测试: Mock, Stub
    和其它