CC's blog

CC的技术博客 专注于 it 互联网的技术爱好者

分类 iOS开发 下的文章

未命名文档

工作概述详细介绍
工作目标1. 完成 React-Native 基础增强框架的开发,构建美菜 React-Native 项目通用框架
2.完成快速构建工具快速创建 React-Native 项目工程
3. 完成美农伙伴项目RN 版本需求一期
4.推进新框架 React-native 在其他 App 的使用,便于统一维护升级
工作完成1.完成 React-Native 基础增强框架的开发,构建美菜 React-Native 项目通用框架(框架一期目标100% 有待二期优化)
2.快速构建工具的开发完成(一期目标100%,插件化尚未得到更好地解决方案)
3.美农伙伴一期开发完成
4 .推进项目接入 mcrn (采供、供应商 伙伴)(70%)
项目成果1.完成项目框架 mcrn 的封装,简化 React-Navigaion 的使用方法,无需复配置即可轻松使用,简化 Redux 的使用,在有人讲解的情况下达到会使用 React 的开发者能在15 分钟内掌握 mcrn 封装后 redux的简单使用,显著降低了 redux 的入门学习成本。简化缓存策略,简单配置缓存模块名称即可完成数据缓存
2.完成项目快速构建工具的开发,在新项目成立时即可快速完成项目的构建即:mcrn init 工程名称即可完成 React-Native 增强框架的初始化,包括iOS Android 与 js基础框架部分,3.美农伙伴一期项目的开发工作,包括amp sentry等系统的对接,状态:已完成,等待上线中 4,推进除美农伙伴外的 供应商、采购App mcrn框架对接()
工作反思总结初期设计一定要考虑的完善一些,否则会给以后工作埋坑,无论是Api开发,或者模块设计,一定不要因为时间的原因在在规范和可扩展性上面打折扣
下季度工作计划
阅读全文
none

React-Native 增强框架(MCRN)

React-Native 增强框架(MCRN)

特点
1抹平平台差异
2更加强大的原生 Api 能力
3自动缓存系统
4逐步完善的全局组件库
5自动页面追踪
6更强大的 Debug 模式

阅读全文
none

MCRN Debug

QA Version

分支切换

说比如我现在开发完了一个订单分支并且已经通过cli 发布,QA 童鞋在需要测试的时候需要摇一摇app,会出现以下界面:


阅读全文
none

Object.keys(), Object.getOwnPropertyNames(), for in的区别

前不久,一朋友求助,让我给解释一波Object.keys(), Object.getOwnPropertyNames(), for in的区别,面试中好几次呗问了。所以,抽了点时间看了看,大概把我看的过程中做的demo记录一下。
看了网上一些关于介绍Object.keys(), Object.getOwnPropertyNames(), for in, Object.getOwnPropertySymbol()的区别,都介绍得不是很详细,不容易理解,今天抽空来说说这三者的区别。
废话不多说,直接上代码。

defineProperty() => 给对象添加单个属性及属性值的,并规定该属性是否可枚举,默认是不可枚举的;所以正常情况下,我们给对象添加单个属性时,只需要用.操作即可。亦,obj.e = 2。这种方式添加的属性默认是可枚举的。
我们通过设置 enumerable 的值来设置属性是否可枚举。
来,下面demo运行起来。

var obj = { a: "1", b: "2"};
Object.prototype.protoName = "proto foobar";
var foo = Symbol("foo");
// 给obj 添加了一个键名为 c, foo 变量值
Object.defineProperty(obj, "c", {
    value: "3", 
    enumerable: false  // 定义是否可枚举,默认 false
})
Object.defineProperty(obj, "d", {
    value: "4", 
    enumerable: true  // 定义是否可枚举
})
Object.defineProperty(obj, foo, {
    value: "foobar",
    enumerable:false
});  

打印的结果为:

{a: "1", b: "2", d: "4", c: "3", Symbol(foo): "foobar"}
1
OK,接下来我们,我们输出日志看看…

for (var i in obj) {
    console.log(" for in : ", i); // 输出 a b d protoName
    if (obj.hasOwnProperty(i)) {
        console.log("obj.hasOwnProperty(i): ", i); // a b d
    }
}
console.log("Object.keys(obj): ", Object.keys(obj));  // ["a", "b", "d"]
console.log("Object.getOwnPropertyNames(obj): ", Object.getOwnPropertyNames(obj));  // ["a", "b", "c", "d"]
console.log("Object.getOwnPropertySymbols(obj): ", Object.getOwnPropertySymbols(obj)); // [Symbol(foo)]
// JSON.stringify(obj) 只能将自身的属性转化成字符串
console.log("JSON.stringify(obj): ", JSON.stringify(obj));  // {"a": "1", "b": "2", "d": "4"}

就上面demo,简单总结一下:

  1. keys() => 输出为一个数组,取到的是 obj 的所有的自身可枚举属性。其功能和for in + hasOwnProperty()功能是一致的
  2. getOwnPropertyNames() => 输出为一个数组,取到的是 obj 的所有自身属性。(可枚举、不可枚举,但不包括symbol类型的属性)
  3. getOwnPropertySymbol() => 输出为一个数组,取到的是 obj 的所有自身的Symbol属性
  4. for in => 遍历 obj 的所有属性,包括自身属性和原型上的所有可枚举的属性
  5. JSON.stringify() => 只能将自身的可枚举的属性转化成字符串

OK, 运行完上面demo后发现,问题是不是轻轻松松地解决了喂,然而,并没有。仔细对比一下上面的日志,然后,来,接着往下走。
for in obj => 能遍历obj的所有属性,包括原型上的属性。(包括原型上的可枚举的属性和方法),有点蒙比了?
如果确实蒙比了,我们接着往下敲代码

Object.defineProperty(obj, "func1", {
    value: function() {console.log("func1")}
})
Object.defineProperty(obj, "func2", {
    value: function() {
        console.log("func2")
    },
    enumerable: true
})

// 来,我们在在原型上添加一个方法

Object.prototype.func3 = function() {
    console.log("func3")
}

for (var i in obj) {
    console.log(" for in : ", i); // 输出 a b d protoName func2 func3
    if (obj.hasOwnProperty(i)) {
        console.log("obj.hasOwnProperty(i): ", i); // a b d func2
    }
}
console.log("Object.keys(obj): ", Object.keys(obj));  // ["a", "b", "d", "func2"]
console.log("Object.getOwnPropertyNames(obj): ", Object.getOwnPropertyNames(obj));  // ["a", "b", "c", "d", "func1", "func2"]
console.log("Object.getOwnPropertySymbols(obj): ", Object.getOwnPropertySymbols(obj)); // [Symbol(foo)]
console.log("JSON.stringify(obj): ", JSON.stringify(obj));  //  {"a":"1","b":"2","d":"4"}
console.log("obj:  ", obj); // {a: "1", b : "2", d : "4", func2 : ƒ (), c : "3", func1 : ƒ (), Symbol(foo) : "foobar"}

对比上面输出日志,我不难发现:

  1. defineProperty() 和 prototype 添加的属性默认是不可枚举的。
  2. defineProperty() 添加的属性时属于自身属性。

哈哈哈,能读到这儿,我想未来的我,可能没有晕吧。
管他呢,简单提个醒吧,方便以后自己更快速地懂这些东西;

  1. for in 没有 func1, 是因为defineProperty()定义的是自身属性,且默认不可枚举。protoName 是在原型 prototype 上,所以会有。
  2. hasOwnProperty() 是只取自身属性,所以 原型上的 protoName, func3 都没有。
  3. keys() 所有的自身可枚举属性, 所以 protoName 和 func3 首先排除了。c 和 func2 是不可枚举。
  4. getOwnPropertyNames() 所有自身属性。所以原型上的protoName 和 func3 都被排除了。
  5. JSON.stringify() 只要自身的,且可枚举的属性。认真看看,转字符串和直接输出的 obj 有多大区别。

所以,网上关于深度克隆一个对象的方式 —- JSON.parse(JSON.stringify(obj)),严格来说,是不正确的。

阅读全文
none

oc 获取文件的md5(hash)

简单的来说:

1)、MD5是使用哈希算法计算文件或字符串的摘要,对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。128/ 8 = 16,也就是说MD5得到的是一组16字节长度的八进制。

阅读全文
none

在Objective-c 中获取http 请求返回的Cookie 并存储 以及 设置请求的Cookie 方法

读取并存储

//获取cookie
 NSArray *cookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage]cookiesForURL:[NSURL URLWithString:url]];
  for (NSHTTPCookie *tempCookie in cookies)
{
    //打印cookies
    NSLog(@"getCookie:%@",tempCookie);
}
 NSDictionary *Request = [NSHTTPCookie requestHeaderFieldsWithCookies:cookies];
 NSUserDefaults *userCookies = [NSUserDefaults standardUserDefaults];
 [userCookies setObject:[Request objectForKey:@"Cookie"] forKey:@"mUserDefaultsCookie"];
 [userCookies synchronize];

设置请求的 Cookie

[session.requestSerializer setValue:[[NSUserDefaults standardUserDefaults]objectForKey:@"mUserDefaultsCookie"]forHTTPHeaderField:@"Cookie"];
阅读全文
none

C 语言如何获取 Shell 命令执行的结果

#include <stdio.h>
#include <string>

void executeCMD(const char *cmd, char *result)
{
    char buf_ps[1024];
    char ps[1024]={0};
    FILE *ptr;
    strcpy(ps, cmd);
    if((ptr=popen(ps, "r"))!=NULL)
    {
        while(fgets(buf_ps, 1024, ptr)!=NULL)
        {
           strcat(result, buf_ps);
           if(strlen(result)>1024)
               break;
        }
        pclose(ptr);
        ptr = NULL;
    }
    else
    {
        printf("popen %s error\n", ps);
    }
}

int main()
{
        char result[1024];
        executeCMD( "ls /opt/*.rpm | awk -F '[-|.]' '{print $3}'", result);
        printf("%s", result );
        return 0;
}


//直接执行命令
system("command str");
阅读全文
none