正确地使用Swift第2部分
虚拟屏幕,注释,模板,命名,静态表格…
上一部分在这里
您可能会注意到,在连接速度较慢的情况下,您的Facebook应用程序屏幕上充满了上图所示的虚拟对象。 看起来很奇怪,但比旋转的加载迹象要少刺激性。 Tumblr应用程序,存储和加载您最后存储在本地存储中的卡。 这比上面的怪异屏幕要聪明得多。
为什么? 在惰性癌症综合征中,人们可以做这样的事情
func getUserData(回调:@转义(_结果:字符串)->()){
let myUrl = URL(string:“ https://www.google.com”);
var request = URLRequest(URL:myUrl!)
让会话= URLSession.shared;
request.httpMethod =“获取”
request.addValue(“ application / json”,对于HTTPHeaderField:“ Content-Type”)
request.addValue(“ application / json”,对于HTTPHeaderField:“ Accept”)
// request.httpBody = jsonData
DispatchQueue.global()。async(){
let task = session.dataTask(with:request){数据,响应,错误
警卫让结果=数据,错误==无其他{
print(“ \(错误?.localizedDescription ??“未知错误”)”)); 返回; }
如果让httpStatus = response为? HTTPURLResponse,httpStatus.statusCode!= 200 {
print(“ statusCode应该为200,但为\(httpStatus.statusCode)”)
print(“ response = \(response)”); }
让responseString = String(数据:结果,编码:.utf8)
//打印(“ responseString = \(responseString)”)
DispatchQueue.main.async {
callback(responseString!)//在此处更新数据
}
}}
task.resume(); }
getUserData {
做{updateData()…}赶上{…}}
如果1连接速度很快,您会发现这非常理想。 2数据很小。 以上条件中的任何一个都不匹配,那么一会儿黑屏。 有罪的光标会有所帮助,但这是错误的方法。
不要喜欢这种方法
1-显示加载光标。
从服务器2加载数据。
3-仅在下载和处理数据时显示数据。
4隐藏载入游标。
你知道为什么。 您将继续查看加载光标一段时间。
像这样
1-显示加载光标。
2后台使用dispatchQuere从服务器加载数据。 在这里参考https://developer.apple.com/documentation/dispatch/dispatchqueue 。 用最简单的方式,代码是这样的
DispatchQueue.global(qos:.background).async {
//在这里做你的工作
DispatchQueue.main.async {
//在此处更新ui
}
}
这将在后台进行加载,然后在数据准备就绪时更新UI。
3前景加载虚拟屏幕,具有默认值(如FB)或最后保存的数据(如Tumblr)。
4隐藏载入游标。
这里还有另一个问题。 您是否注意到,tumblr每个查询仅发送10条帖子? 它是在服务器端,但是,如果您处理图形文件,此方法会有所帮助。 从客户端,知道每个查询的缓冲区,您将跟踪要追加到数组的数据。
由于几个重要原因,我们不得不发表评论
1-几个月后阅读代码时,我们自己。
2-人,作为我们的种族和专业。 离开时更改密码的人不会哭泣。
3-为您的雇主。 他们需要我们可以使用文档生成器处理的文档。 该工具将根据您的评论生成文档。
不要这样
//名称
//目的
//参数
//输出
//用法
为什么? “ //”是行注释,用于变量和逻辑注释,仅用于If Else,定义变量…
像这样
if(thisCondition <thatCondition){} //我们在此处使用行注释
让maxCount = 10 //在此处注释
并且,在文件顶部
/ *名称:GetPinViewController
*目的:验证Pin和用户输入。
*参数:数字字符串
*输出:正确/错误
*用法:对Pin使用弱var localData
* /
另外,在功能之上
/ *名称:警报
*目的:简单的警报框。
*参数:标题:字符串,消息:字符串
*输出:无
*用法:alert(“这是标题”,“这是消息”);
* /
func Alert(_标题:字符串,_消息:字符串){…}
请注意, 标头和函数使用相同的模板 。
为什么? 该模块本身被称为黑盒样式的函数。 此外,文档生成器将对整个结构进行布局。 如果注释正确完成,它将以清晰的图表从主/根目录显示所有模块及其内部功能。 什么? 您不知道PHP的文档生成器可以为Swift做文档吗?
在Xcode中,您应该使用模板面板。 右下方面板上的2个大括号选项卡看起来像{},如下图所示。
标签上,您将看到许多代码模板。
像这样
将此注释复制到编辑器中,然后将其拖放到模板面板中。 它将为您创建一个注释模板。 您可能想使用快捷方式代码。 下次,您只需将该模板从面板中拖放回编辑器中,到文件和func的顶部即可。 您只需填充空格,保存输入即可。
/* 名称:
*目的:
*参数:
*输出:
*用法:
* /
为什么? 从最近十多年的观察来看,由于有些乏味,编码员不愿发表评论。 使用模板或多或少有帮助。 在我的实践中,这仍然是必须的。
假设您有一个类名LoginViewController,则该文件必须使用该类的相同名称保存。 快捷文件LoginViewController适用于类LoginViewController。 此视图控制器的情节提要也应命名为LoginViewController.storyboard。 同样,视图的情节提要ID将为LoginViewController。
总之,您将在登录模块文件夹中找到
- 用于类LoginViewController的快捷文件名LoginViewController.swift
- 一个故事板文件名LoginViewController.storyboard,其中viewcontroller ID为LoginViewController。
为什么? 在代码的后面,什么都涉及LoginViewController,您知道该类的定义在LoginViewController.swift文件中,而其UI将在LoginViewController.storyboard中。
通过这种做法,您的团队,您的下一个编码人员将不会花费数小时来挖掘文件夹中的内容。 使用这种命名方法,“ goto定义”将更加有效。
而且,根模块可以使用如下函数来动态调用其他子模块:
func loadViewControllers(_名为:String){
让Storyboard = UIStoryboard.init(name:named,bundle:nil)
让targetViewController = storyboard.instantiateViewController(withIdentifier:named)
self.navigationController?.pushViewController(targetViewController,动画:true)
}
这还不是理想的,因为我们需要将模块称为带参数的黑盒。 但是,我们必须应用这种命名方法来首先启用黑盒。 我们将尽快对此进行讨论。
为什么在地球上每次我问人们时,答案总是总是必须使用带有图像和2个标签视图的自定义单元的动态表格视图。
对于该单元格,图像和2个标签实际上是预定义的。 我们不需要自定义单元格,我们不需要添加它们,即使它们在情节提要板上不可见,它们也已经存在。
如果已经绑定了单元格-say cell1-,则可以像这样调用图像cell1.imageView =…
此处来自https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/TableView_iPhone/TableViewCells/TableViewCells.html中的Apple文档
“ UITableViewCell
类为此单元格内容定义了三个属性:
-
textLabel
标题的标签(UILabel
对象) -
detailTextLabel
—如果有其他详细信息,则为字幕标签(UILabel
对象) -
imageView
—图像的图像视图(UIImageView
对象)
“
单元中的子视图已预定义并设置了格式。 我们只使用它们,不需要自定义单元格和动态表。
如果您喜欢其他演示文稿,仍然可以在单元格中添加自己的图像和标签,例如
总之,对于不需要动态表的视图,请不要使用它。
为什么? 仅仅是因为静态表的加载要比动态表快得多。 我的测试结果快了十倍。
…