树下的老男孩

工匠之行,在行动中体悟修行的乐趣


  • 首页

  • 技术

  • 其它

  • 归档

浅析React之通信机制(一)

发表于 2016-03-14   |   分类于 tech   |     |   阅读次数


自从Facebook提出了react之后,这个框架的关注度一直居高不下,它所引入的一些东西还是值得学习,比如组件化的开发方式,virtual dom的性能提升方式等,最近为了改进现有的跨平台方案也在研究react,在这边也做下相关的记录。

pre

在开始使用react之前我们需要搭建相应的环境,这个就不在探讨了,具体可以查看官方文档,由于react需要使用javascript语言,所以可能需要去简单了解一下相关的语法(比如:ES6 标准入门),另外iOS在7.0之后引入了javascriptcore框架,极大的方便了js跟oc之间de通信,之前有一篇博客简单的介绍了javascriptcore,有兴趣的也可以去了解一下。

整体框架

react的整体示意图可以用下面图表示,我们所编写的js代码可以在各个平台上运行,这让我们有web的开发效率的同时又有了原生应用的体验。

Learn once, write anywhere
不过这里面包含的东西对于有点多,尤其很多web相关的东西对于没接触过的人还是有些难度的,要想快速的研究透彻可能不太现实,至少对于我是这样的,因此我们首先研究一下react中js跟native之间的通信方法,其它的有待后面在分析。

阅读全文 »

说说JavaScriptCore

发表于 2016-03-01   |   分类于 tech   |     |   阅读次数

javascript目前看来仍是世界上最流行的语言,不管在web、服务端还是客户端都有广泛的应用,很多跨平台方案也采用js来实现,比如著名的reactjs,苹果在iOS7引入了javascriptcore库,提供更简单方便的方式将js接入,iOS7之前要执行js操作只能通过UIWebview中的
stringByEvaluatingJavaScriptFromString方法,而且JavaScriptCore这块的代码开源,可以到这里查看,本文就简单介绍一下JavaScriptCore:

  • Objective-C调用JavaScript
  • JavaScript调用Objective-C
  • 内存管理
  • 多线程

不过在那之前先介绍几个基本概念:

  • JSContext
    一个JSContext实例代表着一个js运行时环境,js代码都需要在一个context上下文内执行,而且JSContext还负责管理js虚拟机中所有对象的生命周期
  • JSValue
    表示一个JavaScript的实体,一个JSValue可以表示很多JavaScript原始类型例如boolean, integers, doubles,甚至包括对象和函数。我们对JS的操作都是通过它,并且每个JSValue都强引用一个context。同时,OC和JS对象之间的转换也是通过它,相应的类型转换如下:

JSValue类型转换

  • JSVirtualMachine
    js代码运行的虚拟机,提供JavaScriptCore执行需要的资源,有自己独立的堆栈以及垃圾回收机制,而且通过锁来实现线程安全,如果需要并发执行js代码,可以创建不同的JSVirtualMachine虚拟机对象来实现;
阅读全文 »

iOS应用程序间共享数据

发表于 2016-02-02   |   分类于 tech   |     |   阅读次数

我们知道iOS由于沙盒的存在,应用程序不能越过自己的区域去访问别的存储空间的内容,不过可能有许多场景我们需要在应用程序之间共享数据,比如多个应用共用用户名密码进行登录等。虽然我们不能直接通过文件系统来分享数据,不过还是有些方法可以实现,为了方便说明,这里同时创建了两个工程Example1和Example2,实现这两个app之间的信息共享,Example1负责写数据,Example2负责读数据,具体的demo代码可以到这里获取

UIPasteboard

剪贴板是应用程序之间传递数据的简单方式,建议不要使用全局的粘贴板,而是自己根据名字创建一个新的粘贴板,防止其它地方全局拷贝的影响。然后把需要共享的内容复制到粘贴板,粘贴板的内容可以是文本、URL、图片和UIColor等,另一个app就可以根据粘贴板的名字去读取相关的信息。

阅读全文 »

细说@synchronized和dispatch_once

发表于 2016-01-07   |   分类于 tech   |     |   阅读次数

工欲善其事,必先利其器。

  通常我们在实现单例时候都会使用synchronized或者dispatch_once方法,初始化往往是下面的样子:
使用synchronized方法实现:

1
2
3
4
5
6
7
8
9
10
static id obj = nil;
+(instancetype)shareInstance
{
@synchronized(self) {
if (!obj) {
obj = [[SingletonObj alloc] init];
}
}
return obj;
}

使用dispatch_once方法实现:

1
2
3
4
5
6
7
8
9
static id obj = nil;
+(instancetype)shareInstance
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
obj = [[SingletonObj alloc] init];
});
return obj;
}

性能差异

  上面的这些写法大家应该都很熟悉,既然两种方式都能实现,我们来看看两者的性能差异,这里简单写了个测试的demo,使用两个方法分单线程跟多线程(采用dispatch_apply方式,性能相对较高)去访问一个单例对象一百万次,对比这期间的耗时,从iPod跟5s测试得到如下的结果

阅读全文 »

谈谈面向对象设计(OOD)原则

发表于 2015-12-23   |   分类于 tech   |     |   阅读次数

拥有一把锤子未必能成为建筑师

  最近在项目开发过程中碰到了一些问题,发现在每波迭代开发过程中,经常需要去修改之前的代码,虽然出现这样的情形很正常,新的需求必然会带来新的功能新的设计,导致之前的代码受到影响。记得看过一个笑话:

“杀一个程序员不需要用枪,改三次需求就可以了”

  其实需求设计是一个方面,另外我们作为设计开发人员有时候也需要去反省,反省一下代码的设计是否合理,为什么新功能的在原有代码上扩展会那么难,为什么我们的代码这么不稳定,牵一发而动全身?

阅读全文 »

有意义的命名

发表于 2015-12-16   |   分类于 others   |     |   阅读次数

名副其实:

变量、函数或类的名称就能够说明为什么它存在,做什么事,怎么用,如果需要注释来补充,就不算名副其实:

1
2
3
4
5
6
//消逝的时间,以日计, bad!
int d;

//good
int daysSinceCreation; 
int daysSinceModification;

避免误导

避免留下隐藏代码本意的错误线索。
accountList 一组账号,如果类型不是List会引起误判,accountGroup或bunchOfAccoutns,甚至accounts,更可怕的例子:使用小些字母l跟字母O作为变量名

做有意义的区分

代码是写给人看的,仅仅是满足编译器的要求,就会引起混乱

  • 以数字系列命名:void copyChars(char a1[],char a2[]) ==> void copyChars(char source[],char destination[])
  • 说废话: a, an, the, Info, Data
  • 使用可读的名字:避免过度使用缩写,genymdhms (生成日期,年月日时分秒)
  • 使用便于搜索的名称:避免使用Magic Number,避免使用单字母,或出现频率极高的短字母组合(注意度的把握);MAX_CLASSER_PER_STUDENT 跟 “7” “e”
阅读全文 »

整洁代码

发表于 2015-12-14   |   分类于 others   |     |   阅读次数

为什么要写糟糕的代码?

  • 赶时间完成任务 ,期望后面再清理.
  • 勒布朗法则:稍后等于永不(Later equals never)

混乱的代价:

  • 代码变的无法管理,团队生产力下降,
  • 增加人力?Brooks定律(人月神话):向进度落后的项目中增加人手,只会使进度更加落后。
  • 破窗理论:假如原来的代码很优秀,新加入的代码会害怕破坏这美妙的整体而变的更好,反之则不会去在意。

开始新设计:

  • 新系统设计与旧系统维护竞赛,时间可持续十年之久,完成时成员早不知去向
  • 花时间保持代码整洁不但关乎效率,还关乎生存
  • 制造混乱无助于赶上工期,只会拖累,唯一方法就是始终尽可能保持代码整洁
阅读全文 »

开源许可证的一些区别

发表于 2015-11-24   |   分类于 others   |     |   阅读次数
我们在看一些开源项目的时候,一般很少去关注开源的许可证,不过有些时候我们需要对这些证书有一定的了解,一张图胜过千言万语:
阅读全文 »
12…4
树下的老男孩

树下的老男孩

28 日志
2 分类
15 标签
© 2015 - 2016 树下的老男孩 | 本站总访问量次
由 Hexo 强力驱动
主题 - NexT.Pisces