正确地使用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 对象)

单元中的子视图已预定义并设置了格式。 我们只使用它们,不需要自定义单元格和动态表。

如果您喜欢其他演示文稿,仍然可以在单元格中添加自己的图像和标签,例如

总之,对于不需要动态表的视图,请不要使用它。

为什么? 仅仅是因为静态表的加载要比动态表快得多。 我的测试结果快了十倍。