Swift单向数据流

Redux

Redux是Javascript程序的状态容器,遵循3个原则让复杂的状态管理变得容易。

三大原则

单一数据源

整个应用的state被存储在一棵object tree中,并且这个object tree只存在唯一一个store中。

状态只读

store中 state 是只读的,如果想要变更状态,只能通过action来进行。
视图、网络等事件不能直接修改state,它们只能表达想修改的意图(例如:添加一行数据,数据内容是XXX)。所有的修改都被集中化处理,并且严格按照一个接一个的顺序执行。

使用纯函数来执行修改

为了描述action如何修改state,需要编写reducers。
Reducer只是一些纯函数,它接受先前的state和action,并返回新的state。

继续阅读Swift单向数据流

C语言中的static

最近在学习C语言,其中看到static的时候发现和OOP语言含义有所不同。
首先static分为两种情况。

1. 全局静态变量

A文件中定义一个全局静态变量a,在B文件引入A文件后是不能访问这个变量a的。
这个可以理解成swift中的fileprivate,a的作用域为A文件,外部文件无法访问。

2.局部静态变量(在函数中声明一个static变量)

A文件中定义一个全局静态变量a,在B文件中无法访问。这个和情况1一致。
除此之外
static的变量只会分配一次内存空间,多次调用static int a = 0 并不会真的将a变成0。

void printStr()
{
int normal = 0;
static int stat = 0; //this is a static local var
printf("normal = %d ---- stat = %d\n",normal, stat);
normal++;
stat++;
}

在这个函数中,打印的值会是以下的结果。
normal = 0 , stat = 调用这个函数的次数。

《Swift进阶》内建集合类型 字典

Swift 中另外一个关键的数据结构就是Dictionary,字典。字典包含键以及对应的值。在一个字典中,每个键都只能出现一次。通过键来取值所花费的平均时间是常量级的(数组中寻找特定的元素花的时间与它的数组的尺寸成正比)。和数组不同的是字典是无序的,遍历字典的键值对时,顺序是不确定的。

我们可以用下标来获取值(比如dict[“Name”]),字典查找将返回可选值,不存在的时候返回nil。这里和数组不同,使用越界下标访问程序将会崩溃。

字典是一种稀疏结构,即使在name键下有值,你也没办法确定address键下面是否有值。 继续阅读《Swift进阶》内建集合类型 字典

《Swift进阶》内建集合类型 数组

数组和可变性

在swift中,使用let定义的数组为不可变的数组,使用var定义的数组为可变数组。在不可变的数组中使用append这样的方法,会得到一个编译错误。

swift的Array数组是struct值类型,当复制到新变量的时候里面的值会被复制,也就是说改变其中一个变量,另外一个变量不会受到影响。

在Foundation框架中的NSArray和NSMutableArray是引用类型的class,因为引用类型的特性,使用let并不能保证这个数组不会被改变。

如果使用Foundation框架中的数组,为了安全,赋值最好使用copy方法进行。 继续阅读《Swift进阶》内建集合类型 数组

iOS Universal Links

什么是Universal Links?

Universal Links 中文名:通用链接,是苹果在推出iOS9的时候推出的新功能,一种能方便的通过传统的HTTP链接来启动App,使用相同的网址打开网站和App。

通过唯一的网址,不需要Schema就可以跳转到界面到App里面,比如说在搜索引擎中搜索到某新闻(比如OO新闻网),点击新闻链接之后,如果iOS设备中安装了(并且支持通用链接)的应用,那么它将自动在App中打开这个页面,如果没有安装则在Safari中直接打开链接(和浏览网站一样)。

如果在服务器上配置Universal Links?

需要在域名根目录创建一个 apple-app-site-association 文件,没有任何扩展名。

文件内容如下:

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "9JA89QQLNQ.com.apple.wwdc",
                "paths": [ "/wwdc/news/", "/videos/wwdc/2015/*" ]
            },
            {
                "appID": "TeamID.BundleID2",
                "paths": [ "*" ]
            }
        ]
    }
}

appID 必须是TeamID.Bundle Identifier的组合

根据paths键设定允许的列表,或者使用星号来表示任意。

注意:区分大小写。

举例:

* 只要域名符合即可,路径随意。
比如:http://xloli.net

/news/id/* 路径必须是 “/news/id/” + 后面任意
比如:http://xloli.net/news/id/12345

/news/ 路径必须是 “/news/”
比如:http://xloli.net/news/

再次提醒,apple-app-site-association必须在根目录。

Web服务器必须支持HTTPS,客户端只支持HTTPS协议访问,并且不支持任何重定向。

App处理Universal Links

点击项目设置中的Capabilities,将AssociatedDomains打开为ON(同时还需要在开发者网站中AppID中也要打开)。

在下面Domains中添加域名,格式如下:

applinks:domain.com

举例:

applinks:xloli.net
applinks:www.xloli.net

当设置完毕之后,当你第一次启动App的时候会从指定的路径自动下载文件。

https://domain.com/apple-app-site-association

最后需要在AppDelegate中实现自己的逻辑,比如根据URL的规则进行指定的跳转。

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {
        if let url = userActivity.webpageURL {
            print(url)
            // 根据URL 书写自己必要的逻辑代码
        }
        return true // true 将会打开App, false 不会打开App。
}

iOS 跳转到系统App的方法

使用 UIApplication.sharedApplication().openURL 方法可以跳转到系统的App中。

跳转到程序 自身的设定可以使用以下方法:

 Swift

UIApplication.sharedApplication().openURL(NSURL(string: UIApplicationOpenSettingsURLString))

Objc

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString]];

参考:

About —> prefs:root=General&path=About

Accessibility —> prefs:root=General&path=ACCESSIBILITY

Airplane Mode On —> prefs:root=AIRPLANE_MODE

Auto-Lock —> prefs:root=General&path=AUTOLOCK

Brightness —> prefs:root=Brightness

Bluetooth —> prefs:root=General&path=Bluetooth

Date & Time —> prefs:root=General&path=DATE_AND_TIME

FaceTime —> prefs:root=FACETIME

General —> prefs:root=General

Keyboard —> prefs:root=General&path=Keyboard

iCloud —> prefs:root=CASTLE

iCloud Storage & Backup —> prefs:root=CASTLE&path=STORAGE_AND_BACKUP

International —> prefs:root=General&path=INTERNATIONAL

Location Services —> prefs:root=LOCATION_SERVICES

Music —> prefs:root=MUSIC

Music Equalizer —> prefs:root=MUSIC&path=EQ

Music Volume Limit —> prefs:root=MUSIC&path=VolumeLimit

Network —> prefs:root=General&path=Network

Nike + iPod —> prefs:root=NIKE_PLUS_IPOD

Notes —> prefs:root=NOTES

Notification —> prefs:root=NOTIFICATIONS_ID

Phone —> prefs:root=Phone

Photos —> prefs:root=Photos

Profile —> prefs:root=General&path=ManagedConfigurationList

Reset —> prefs:root=General&path=Reset

Safari —> prefs:root=Safari

Siri —> prefs:root=General&path=Assistant

Sounds —> prefs:root=Sounds

Software Update —> prefs:root=General&path=SOFTWARE_UPDATE_LINK

Store —> prefs:root=STORE

Twitter —> prefs:root=TWITTER

Usage —> prefs:root=General&path=USAGE

VPN —> prefs:root=General&path=Network/VPN

Wallpaper —> prefs:root=Wallpaper

Wi-Fi —> prefs:root=WIFI

Android Studio 手动启用 AIDL

通常使用新建-ADIL会自动的创建相关的配置,不过在手动更名的方式下可能无法自动创建配置,这个时候需要修改项目中的build.gradle文件。

在build.gradle文件中android节点里添加以下的代码就可以了。

    sourceSets{

        main{

            aidl.srcDir \’src/main/java\’

        }

    }

中间的aidl.srcDir 后面的路径要填写实际的目录(不用到Package)。

RelativeLayout常用属性介绍

第一类:属性值为true或false

android:layout_centerHrizontal 水平居中

android:layout_centerVertical 垂直居中

android:layout_centerInparent 相对于父元素完全居中

android:layout_alignParentBottom 贴紧父元素的下边缘

android:layout_alignParentLeft 贴紧父元素的左边缘

android:layout_alignParentRight 贴紧父元素的右边缘

android:layout_alignParentTop 贴紧父元素的上边缘

android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物

继续阅读RelativeLayout常用属性介绍

RxSwift 入门 - 第二部分

Subject

Subject其实就是Observer,拥有Observer的所有功能,也可以认为是热的Observer。
所谓热冷的区别在于,冷的Observable,它等待有订阅才开始发送数据,而Subject把原来冷的给变成热的。
Subject有以下的子类可以使用:

  • PublishSubject
  • ReplaySubject
  • BehaviorSubject
  • Variable

继续阅读RxSwift 入门 - 第二部分

RxSwift 入门 - 第一部分

Observables

Observables是一个事件流的对象,通过以下的函数可以生成一个事件流。

  • empty
  • just
  • of
  • toObservable
  • create
  • error
  • deffered

通过subscribe方法可以监听订阅流中的数据,在闭包中进行必要的逻辑编程。

热信号vs冷信号

信号分两种,热信号在它创建的时候就开始推送事件,这意味着如果后面有订阅者来的时候,就可能会错过一些事件。而冷信号则不会,只有在它被订阅的时候,它才会发送事件,这可以保证后面即使有订阅者中途加入的时候也能收到完整的事件序列。

继续阅读RxSwift 入门 - 第一部分

Xcode真机调试could not find developer disk image解决方法

在使用Xcode进行真机调试的时候,由于真机系统过高或者过低,Xcode中没有匹配的配置文件,会出现【could not find developer disk image】的错误,通常更新最新版本的Xcode可以解决问题,如果不想更新,可以从官网下载最新的Xcode或者Xcode beta (如果测试机为 beta版系统) 下载最新的dmg文件,在下面的文件夹中寻找需要的配置文件夹。

继续阅读Xcode真机调试could not find developer disk image解决方法

解决Xcode6模拟器消失的问题

最近公司重新安装了一下xcode6,发现以前所使用的iPhone模拟器全部消失了,只剩下一个自己的真机在上面,通过网上查询资料找到了解决办法。

依次打开“Xcode->Window->Devices”,点击位于左下角的“+”按钮,新增常使用的设备即可,不常使用的设备也可以在选中后,点击“-”移除。

不知道是什么时候才出现的这个问题,之前一直使用xcode6 beta没有遇到问题。

iOS判断推送权限开关是否打开

根据 [[UIApplication sharedApplication] enabledRemoteNotificationTypes] 的返回值来进行判断,该返回值是一个枚举值,如下:

typedef enum {
UIRemoteNotificationTypeNone = 0,
UIRemoteNotificationTypeBadge = 1 << 0,
UIRemoteNotificationTypeSound = 1 << 1,
UIRemoteNotificationTypeAlert = 1 << 2,
UIRemoteNotificationTypeNewsstandContentAvailability = 1 << 3,
} UIRemoteNotificationType;

如果是 UIRemoteNotificationTypeNone ,则可以认为推送开关没有打开,反之亦然。

不过在iOS8中苹果对其做出了调整,需要使用下面的代码进行判断:

if (is_ios_8) {
UIUserNotificationSettings *mySet = [[UIApplication sharedApplication] currentUserNotificationSettings];
mySet.types; // <– 这里是一个枚举值
}

枚举值有如下:

typedef NS_OPTIONS(NSUInteger, UIUserNotificationType) {
UIUserNotificationTypeNone = 0, // the application may not present any UI upon a notification being received
UIUserNotificationTypeBadge = 1 << 0, // the application may badge its icon upon a notification being received
UIUserNotificationTypeSound = 1 << 1, // the application may play a sound upon a notification being received
UIUserNotificationTypeAlert = 1 << 2, // the application may display an alert upon a notification being received
} NS_ENUM_AVAILABLE_IOS(8_0);

MySQL数据库”mysql SQL Error:1146,SQLState:42S02 “解决方法

项目在开发的时候在Mac平台下开发的,开发完了之后在LINUX环境上部署好之后,运行时MySQL数据库报错,提示为某个表不存在之类的错误信息,后来修改了MySQL的配置文件将大小写敏感去掉,问题解决。
这个问题的根源在于,在 MySQL 中,数据库和表其实就是数据目录下的目录和文件,因而,操作系统的敏感性决定数据库和表命名的大小写敏感。这就意味着数据库和表名在 Windows 中是大小写不敏感的,而在大多数类型的 Unix/Linux 系统中是大小写敏感的。

继续阅读MySQL数据库”mysql SQL Error:1146,SQLState:42S02 “解决方法

Swift学习笔记(二) 函数和闭包

函数和闭包

使用 func 来声明一个函数

func greet(name: String,day:String) -> String{
    return "Hello \(name), today is \(day)."
}
println(greet("Zmsky","HapplyDay”))

使用元祖来返回多个值

func getGasPrices() -> (Double,Double,Double){
    return (3.59,3.69,3.79)
}
getGasPrices()

继续阅读Swift学习笔记(二) 函数和闭包

Swift学习笔记(一) 基础部分

Swift 是一种适用于 iOS 和 OS X 应用的全新编程语言,它建立在最好的 C 和 Objective-C 语言之上,并且没有 C 语言的兼容性限制。Swift 采用安全的编程模式,增加了现代功能使编程更容易、更灵活、更有趣。Swift 以成熟且备受宠爱的 Cocoa 和 Cocoa Touch 框架为 支撑,这是一个重新构想软件开发的机会。
Swift 经过了数年的酝酿,Apple 通过改进现有的编译器、调试器和框架结构奠定了 Swift 的 基础,并通过 Automatic Reference Counting(ARC)简化了内存管理。Swift 的 framework stack 建立在坚实的 Foundation 和 Cocoa 基础之上,实现了现代化和彻底标准化。Objective-C 本身已经逐步发展到到支持 blocks、 collection literals 和 modules,使框架不间断地采 用现代语言技术。基于这个基础,我们可以为今后的 Apple 软件开发引入一种新语言。

继续阅读Swift学习笔记(一) 基础部分

iOS开发之利用APNS进行信息推送

iOS消息推送的工作机制可以简单的用下图来概括:

[转载]百度网盘上传脚本bpcs_uploader[转载]百度网盘上传脚本bpcs_uploader1

Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务器。

上图可以分为三个阶段:

第一阶段:应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。
第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发送到iPhone。

第三阶段:iPhone把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。

继续阅读iOS开发之利用APNS进行信息推送

Mac下MySql卸载方法

Mac上的一些dpkg只提供安装功能,没有卸载功能,简直是流氓。

于是乎今天安装MySQL就真遇到了这种问题,好吧,只有手动来搞了。

先停止所有mysql有关进程。

sudo rm /usr/local/mysql
sudo rm -rf /usr/local/mysql*
sudo rm -rf /Library/StartupItems/MySQLCOM
sudo rm -rf /Library/PreferencePanes/My*
vim /etc/hostconfig and removed the line MYSQLCOM=-YES-
rm -rf ~/Library/PreferencePanes/My*
sudo rm -rf /Library/Receipts/mysql*
sudo rm -rf /Library/Receipts/MySQL*
sudo rm -rf /var/db/receipts/com.mysql.*

[BUG-FIX]PHPYun人才系统-公司发布职位二级三级关联问题

问题页面:member/index.php?task=jobadd
程序版本:2.5GBK
问题情况:
后台设置的职位 部分有三级 部分没有,导致选过有三级的二级职位后再选没有三级的二级职位将会保留上次的三级职位,产生问题。

继续阅读[BUG-FIX]PHPYun人才系统-公司发布职位二级三级关联问题

[BUG-FIX]PHPYun人才系统-职位页面工作地点显示异常

问题页面:index.php?act=com&task=comapply
程序版本:2.5GBK
问题情况:
职位表里面的 省ID和城市ID在多表查询中 与 公司表发生冲突,导致职位页面工作地点显示公司地点。

继续阅读[BUG-FIX]PHPYun人才系统-职位页面工作地点显示异常