首先是简单的WebView

引用于Webkit

代码极其简单~

可以配合顶部栏隐藏来实现一个网页的阅读

隐藏方法:

1
2
3
4
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.setNavigationBarHidden(true, animated: true)
}

关于Alamo

先贴基操及网址

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
// MARK: Alamofire 的Get请求
func alamofireGet1() -> Void {
/**
该请求只有一个参数 'URLRequest',并返回请求对象(DataRequest)。我们可以处理请求对象(DataRequest)获取我们需要的数据。
*/
let dataRequest:DataRequest = Alamofire.request("http://www.jianshu.com/u/23dd8d9701bf")

// 输出请求返回的对象
print(dataRequest)
/**
输出结果
GET http://www.jianshu.com/u/23dd8d9701bf
*/

// 解析请求的对象
dataRequest.response { (DDResponse) in
// 获取请求的状态码
let stateCode = DDResponse.response?.statusCode
print(stateCode!)

// 获取请求的数据
print(DDResponse.data!)// 只输出数据有多少字节数
// 将数据转化为字符串
let dataStr = String.init(data: DDResponse.data!, encoding:String.Encoding.utf8)
print(dataStr!)

// TODO: 输出请求对象
let requestSwf = DDResponse.request
print(requestSwf!)
/*通过请求对象,我们可以获取请求的一系列信息*/
// 请求头文件
print(requestSwf?.allHTTPHeaderFields as Any)
// 获取请求的缓存规则
print(requestSwf?.cachePolicy as Any)
// 获取请求体(body)
print(requestSwf?.httpBody as Any)
// 获取请求的方法
print(requestSwf?.httpMethod as Any)


// TODO: 输出请求响应对象
let responseSwf = DDResponse.response
print(responseSwf!)
/**
输出响应对象:
<NSHTTPURLResponse: 0x608000221020> { URL: http://www.jianshu.com/u/23dd8d9701bf } { status code: 200, headers {
"Cache-Control" = "max-age=0, private, must-revalidate";
Connection = "keep-alive";
"Content-Encoding" = gzip;
"Content-Type" = "text/html; charset=utf-8";
Date = "Sat, 30 Sep 2017 06:43:45 GMT";
Etag = "W/\"663fd325a56556576a8facd92d50bedd\"";
Server = Tengine;
"Set-Cookie" = "_maleskine_session=Y1JTZ2xhYnZ6b3dMZnZaZmVQeHZqVFN5L2QyWDJmaURtcVVBNXFGSXhRWlMvTUxzUWRhTkRFdy83NVAzbW0yNHhqQ05KNkN1WFJTTURTSkNYVnkzYmV6Wm96bmZyVU1kY0VQK3l6bENwN1JUVmdEaGtVY2NBUEdjbzBCZjAvdGVDTWRvRkhlZG16c2tjOGUzSnRvTVVBQWNNYUZyazhNRXlWellNeFFnNHFISTZMQ213bzFKNzV5OEdkYjF5VGRKbE9HdUJtWGpqV0VKU1RNcVJ3TktnMEFjclhFdFRtS3dKYngzek9pM2dWbGcyMmtQc0dLRU1RbDk2bUN2WW9jd3N3OWNMeFFqRkMrK08vYU5aWklEakxIanc2T1k3WjNsbFB1OVF4Rmd1VFZ0b1p2SFZnQ3l0WVVmZFM1KzZ4YmEzNTFhcjhVNHE5K0dacDlsM3RtMDBRPT0tLWxWaTQwNGpwVmZVaHdjNnc3Rk9teUE9PQ%3D%3D--a78f5fd47ad6bf048e57fd6701649281b26b2c63; path=/; HttpOnly";
"Transfer-Encoding" = Identity;
"X-Content-Type-Options" = nosniff;
"X-Frame-Options" = DENY;
"X-Request-Id" = "33b02181-e572-423c-ac45-a373e55edd6b";
"X-Runtime" = "0.078608";
"X-Via" = "1.1 wdx18:10 (Cdn Cache Server V2.0)";
"X-XSS-Protection" = "1; mode=block";
} }
*/

// TODO: 输出请求的错误信息
print(DDResponse.error as Any)

// TODO: 获取请求/响应统计信息的任务指标。
print(DDResponse.metrics!)
}

// TODO: 以二进制数据形式输出请求结果(也可以说解析请求结果)
dataRequest.responseData { (data) in
print(data)
/*输出:SUCCESS: 24039 bytes */
}

//TODO: 以JSON形式的输出请求数据(以JOSN形式解析结果)
dataRequest.responseJSON { (dataResponse) in
// 输出一个 'DataResponse' 的对象
print(dataResponse)

// 通过‘DataResponse’ 我们可以获取一些信息
// 1.请求的连接
print(dataResponse.request!)

// 2. 请求响应的对象
print(dataResponse.response!)

// 3. 请求返回的数据
print(dataResponse.data!)

// 4. 服务器返回的结果
print(dataResponse.result)

// 5.完成请求需要的时间
print(dataResponse.timeline)
}

//TODO: 将返回数据以字符串的形式解析
dataRequest.responseString { (dataResponse) in
// 输出一个 'DataResponse' 的对象
print(dataResponse)

// 通过‘DataResponse’ 我们可以获取一些信息
// 1.请求的连接
print(dataResponse.request!)

// 2. 请求响应的对象
print(dataResponse.response!)

// 3. 请求返回的数据
print(dataResponse.data!)

// 4. 服务器返回的结果
print(dataResponse.result)

// 5.完成请求需要的时间
print(dataResponse.timeline)
}

//TODO: 将数据以PLIST文件形式输出
dataRequest.responsePropertyList { (dataResponse) in
// 输出一个 'DataResponse' 的对象
print(dataResponse)

// 通过‘DataResponse’ 我们可以获取一些信息
// 1.请求的连接
print(dataResponse.request!)

// 2. 请求响应的对象
print(dataResponse.response!)

// 3. 请求返回的数据
print(dataResponse.data!)

// 4. 服务器返回的结果
print(dataResponse.result)

// 5.完成请求需要的时间
print(dataResponse.timeline)
}

//TODO: 在线程中处理请求的数据
let dispathQu = DispatchQueue.main
dataRequest.response(queue: dispathQu) { (ddataResponse) in
// 返回一个‘DefaultDataResponse’ 对象
print(ddataResponse)

// 1、获取请求体
print(ddataResponse.request!)

// 2、获取请求响应体
print(ddataResponse.response!)

// 3、获取请求数据
print(ddataResponse.data!)

// 4、获取请求的错误信息
print(ddataResponse.error!)
}

// 请求的进度
print(dataRequest.progress)
}

日报源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import Alamofire
class Alama {

static func alamofireGet(someclosure:@escaping () -> Void) {
let dataRequest: DataRequest = Alamofire.request("https://news-at.zhihu.com/api/4/news/latest")
dataRequest.responseJSON { d in
do {
let datas = try JSONDecoder().decode(dataGet.self, from:
d.data!)

for story in datas.stories {
titles.append(story.title)
imageUrls.append(story.image ?? "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1573901419402&di=4e251c785265a57a38477c2fa9385dc9&imgtype=0&src=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201705%2F05%2F20170505194734_cGCea.thumb.700_0.jpeg")
hints.append(story.hint)
someclosure()
}

} catch {
print("error")
}
}
}
}
Alama.alamofireGet(someclosure: tableView.reloadData)

写的时候纠结了一两天,为了一个异步处理发愁,简单来说就是网络请求的数据没有到数组中但是tableView就已经初始化了

就很难过,之后看了几遍看到了一个方法:**tableView.reload()**我的妈,我就怎么没有想到,于是乎,傻乎乎的加了个代码

1
2
Alama.alamofireGet()
tableView.reload()

拜托这没用啊,就是在数据来之前我自己又刷新了一遍。。。

好吧。。。

于是乎今天请教J哥,好吧,闭包,那就看闭包,逃逸闭包,解决;

附尾随闭包及闭包知识复习

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
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
completionHandlers.append(completionHandler)
}

func someFunctionWithNonescapingClosure(closure: () -> Void) {
closure()
}

class SomeClass {
var x = 10
func doSomething() {
someFunctionWithEscapingClosure { self.x = 100 }
someFunctionWithNonescapingClosure { x = 200 }
}
}

let instance = SomeClass()
instance.doSomething()
print(instance.x)
// Prints "200"

completionHandlers.first?()
print(instance.x)
// Prints "100"