Swift - 使用NSURLSession同步获取数据(通过添加信号量)

首先非常感谢代码的原作者,为了查询方便我就在这里又留了一份,请见谅.

原文http://www.hangge.com/blog/cache/detail_816.html

过去通过 NSURLConnection.sendSynchronousRequest() 方法能同步请求数据。从iOS9起,苹果建议废除 NSURLConnection,使用 NSURLSession 代替 NSURLConnection。

如果想要 NSURLSession 也能够同步请求,即数据获取后才继续执行下面的代码,使用信号、信号量就可以实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//创建NSURL对象
let urlString:String="http://www.hangge.com"
let url:NSURL! = NSURL(string:urlString)
//创建请求对象
let request:NSURLRequest = NSURLRequest(URL: url)

let session = NSURLSession.sharedSession()

let semaphore = dispatch_semaphore_create(0)

let dataTask = session.dataTaskWithRequest(request,
completionHandler: {(data, response, error) -> Void in
if error != nil{
print(error?.code)
print(error?.description)
}else{
let str = NSString(data: data!, encoding: NSUTF8StringEncoding)
print(str)
}

dispatch_semaphore_signal(semaphore)
}) as NSURLSessionTask

//使用resume方法启动任务
dataTask.resume()

dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
print("数据加载完毕!")
//继续执行其他代码.......

使用Swift解析json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
let jsonObject = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers)
print(jsonObject)

let array = jsonObject as! NSArray

//读取数组中某个key所对应的所有值
print(array.valueForKey("text"))

//读取第一个元素
print(array[0])

//读取第一个元素的key对应的值
let text = array[0].valueForKey("text")
print(text)

//在使用if let语句的时候,swift会自动进行拆包
if let state = array[0].objectForKey("state") {
print(state)
}

结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
(
{
id = 1;
state = closed;
text = "Node 1";
},
{
id = 2;
state = open;
text = "Node 2";
},
{
id = 3;
state = open;
text = "Node 3";
},
{
id = 4;
state = open;
text = "Node 4";
}
)
(
"Node 1",
"Node 2",
"Node 3",
"Node 4"
)
{
id = 1;
state = closed;
text = "Node 1";
}
Optional(Node 1)
closed

计算质数(极速版)

计算1000000以内的质数只用了398毫秒,闪电一样的速度.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
long start = System.currentTimeMillis();

for (int i = 1; i < 100; i++) {
double r = Math.sqrt(i);
for (int j = 2; j < r; j++) {
if(i % j == 0) {
break;
}else if( j > r )
{
System.out.println(i);
}
}
}

long end = System.currentTimeMillis();
System.out.println(end - start);

Elasticsearch自定义分析器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
PUT /my_index
{
"settings": {
"analysis": {
"char_filter": {
"&_to_and": {
"type": "mapping",
"mappings": [ "& => and "]
}},
"filter": {
"my_stopwords": {
"type": "stop",
"stopwords": [ "the", "a" ]
}},
"analyzer": {
"my_analyzer": {
"type": "custom",
"char_filter": [ "html_strip", "&_to_and" ],
"tokenizer": "standard",
"filter": [ "lowercase", "my_stopwords" ]
}}
}
}
}

状态模式

定义: 允许对象在内部状态改变时改变它的行为,对象看起来像是修改了它的类.
Context对象会随时间而改变状态,而任何的状态改变都是定义好的.

PageRank算法

详细内容参考http://blog.csdn.net/Leonis_v/article/details/50531032

PageRank算法原理

PageRank的计算充分利用了两个假设:数量假设和质量假设。步骤如下:
1)在初始阶段:网页通过链接关系构建起Web图,每个页面设置相同的PageRank值,通过若干轮的计算,会得到每个页面所获得的最终PageRank值。随着每一轮的计算进行,网页当前的PageRank值会不断得到更新。

2)在一轮中更新页面PageRank得分的计算方法:在一轮更新页面PageRank得分的计算中,每个页面将其当前的PageRank值平均分配到本页面包含的出链上,这样每个链接即获得了相应的权值。而每个页面将所有指向本页面的入链所传入的权值求和,即可得到新的PageRank得分。当每个页面都获得了更新后的PageRank值,就完成了一轮PageRank计算。

Elasticsearch中初步使用filter

1
2
3
4
5
6
7
8
9
10
11
12
13
GET /nm*/_search
{
"query": {
"filtered": {
"query": {
"match_all": {} ①
},
"filter": {
"term": { "pub_time": 1449791040000 }
}
}
}
}

一定要保证①处能够查询出数据, 然后后边的 filter 才会有意义, 否则根本查询不到数据.