构建开发环境 构建demo

I should start this article with a disclaimer: It is based on iOS 13, Swift 5, and Xcode 11.x. If you’re reading this and those numbers look dated, be forewarned.

我应该以免责声明开头:它基于iOS 13,Swift 5和Xcode11.x。 如果您正在阅读本文,并且那些数字看起来过时,请提前警告。

I should also warn you that notifications — principally remote ones — involve Apple’s infrastructure, which means you’ll need an Apple Developer account to use them. Of course, you also need one to use CloudKit.

我还应该警告您,通知(主要是远程通知)涉及Apple的基础设施,这意味着您需要有Apple Developer帐户才能使用它们。 当然,您还需要使用CloudKit。

This series recently ended… only it dawned on me that I was being a bit hypocritical. I started off by mentioning unfinished tutorials on notifications and ended up writing one with a monster to-do list at the end.

这个系列最近结束了……直到我意识到我有点虚伪。 我从提及未完成的通知教程开始,最后写了一个最后的怪物待办事项清单。

As such, I thought I better try and bring things to a complete conclusion by covering the majority if not all of the open points. Of course, I also found a few bugs that I’ll go over too. I did try and do just two more chapters, but I think we’re going to need 13 chapters, which is fitting. Many things end on Chapter 13.

因此,我认为我最好尝试覆盖大多数(如果不是全部)开放点,从而使事情更完整。 当然,我也发现了一些错误,这些错误也将予以解决。 我确实尝试过再做两章,但我认为我们将需要13章,这很合适。 许多事情在第13章结束。

第十一章 (Chapter 11)

First, some quick wins. Apple launched a new framework at WWDC2019 called Network, and within it, there is a means to check the network connectivity. Define a new class, call it Connect, and add this code in there:

首先,一些快速的胜利。 苹果在WWDC2019上推出了一个名为Network的新框架,该框架内有一种检查网络连接的方法。 定义一个新类,将其称为Connect ,然后在其中添加以下代码:

We could have used a passthruSubject here, but since the result is almost instant, let’s use a variable. The Connect class I defined is a singleton within which I included variables pointing to the callbacks so that you can extend its functionality beyond the class itself. It’s not needed for our app, but I left it in for good measure.

我们本可以在这里使用passthruSubject ,但是由于结果几乎是即时的,因此我们使用一个变量。 我定义的Connect类是一个单例,其中包含指向回调的变量,因此您可以将其功能扩展到类本身之外。 我们的应用程序不需要它,但我还是留给了它很好的帮助。

Now over to the Storage.swift file. Add this method to it:

现在转到Storage.swift文件。 添加此方法:

This checks that you’re connected to iCloud and comes back with a status message. Obviously, you need to add both these checks to the start of your app:

这将检查您是否已连接到iCloud并返回状态消息。 显然,您需要将这两项检查都添加到应用程序的开头:

Let’s continue. A lot of the to-do list seemed to be in CloudKit.

让我们继续。 许多工作清单似乎都在CloudKit中。

What about that directory question? I crafted a recursive version of the code that reads the public directory, so it reads, reads, and carries on reading until it gets all the records. It will do the job, but it has two major drawbacks I can come up with offhand:

那目录问题呢? 我编写了递归版本的代码,该版本读取公共目录,因此它将读取,读取并继续读取直到获得所有记录。 它将完成工作,但是我可以马上提出两个主要缺点:

  • Your device may run out of memory or indeed be killed by the iOS for using too much memory too quickly.您的设备可能会用完内存,或者由于使用过多内存而被iOS杀死。
  • The fetching operation may take so long that it’ll make your app look like it is frozen — and then it will be killed by the user.提取操作可​​能需要花费很长时间,以至于使您的应用看起来像被冻结了一样,然后被用户杀死。

It’s not ideal having a method that may result in death. Here’s the code in question:

有可能导致死亡的方法并不理想。 这是有问题的代码:

We need to be more selective. Let’s get smarter by using the NSPredicate string comparison operators. There are five: BEGINSWITH, CONTAINS, ENDSWITH, LIKE, and MATCHES. Let’s re-jig the last method to include a smarter predicate:

我们需要更具选择性。 让我们通过使用NSPredicate字符串比较运算符来变得更聪明。 有五个: BEGINSWITHCONTAINSENDSWITHLIKEMATCHES 。 让我们重新添加最后一个方法以包含一个更智能的谓词:

Note: I added the code inside the comments to help me clean up the database after we did some testing of the above.

注意:在对上述内容进行了一些测试之后,我在注释内添加了代码,以帮助我清理数据库。

We could combine this with a slider on our interface to give you a tab-like search, so you could move the slider and it’ll issue a search for all names beginning with the letter X. Edit the ContentView.swift and tag this code onto the pickerview to the implement the new cloudKit directory search:

我们可以将其与界面上的滑块组合在一起,以进行类似标签的搜索,因此您可以移动滑块,它将对所有以字母X开头的名称进行搜索。 编辑ContentView.swift并将此代码标记到pickerview上,以实现新的cloudKit目录搜索:

To test this one, we’re going to need 100+ devices — admittedly a tall order. Let’s compromise with some dummy accounts. Use this code to create a test set:

为了测试这一点,我们将需要100多种设备-无疑是一个很高的订单。 让我们用一些虚拟帐户妥协吧。 使用以下代码创建测试集:

Compile everything, put it in place, and go for it. Obviously, you need to call the fake account method just once. Add it to a .appear tag on the interface compile, run, and then comment it out.

编译所有内容,将其放在适当的位置,然后继续进行。 显然,您只需要调用一次假帐户方法。 将其添加到界面上的.appear标记中,进行编译,运行,然后将其注释掉。

I do confess it is a little bit ZX81, but it is OK. After you convince yourself that it all works, go back to V4 of the directory search and uncomment the lines that call the delete records method that is shown here. Run it and clean up your test accounts:

我承认这是ZX81,但还可以。 在使自己确信这一切可行之后,请返回目录搜索的V4,并取消注释此处显示的调用delete records方法的行。 运行它并清理您的测试帐户:

Still on CloudKit, we need a means of signaling that we want to delete the user. Let’s use a long press on the image. We’ll need a confirm protocol in place too, so let’s use an alert popup with a yes/no. Start with these new methods in your Cloud.swift file:

仍然在CloudKit上,我们需要一种信号来表示要删除用户。 让我们在图像上长按。 我们也需要一个确认协议,因此我们使用带有yes / no的警报弹出窗口。 从Cloud.swift文件中的以下新方法开始:

Obviously, we also need a means of searching for the record to delete too:

显然,我们还需要一种搜索​​记录以删除记录的方法:

Having added the functionality, you now need to add some new variables to your ContentView.swift and some gestures to the image view too:

添加了功能之后,您现在还需要向ContentView.swift添加一些新变量,并向图像视图添加一些手势:

OK, if you cut-and-pasted all the code, you should be ready to test again. Delete all the entries in your database and then create a new user. Check the CloudKit dashboard to ensure that they are there. Then delete them with a long press on the image. Once deleted, check your CloudKit dashboard again to make sure it worked!

好的,如果您剪切并粘贴了所有代码,则应该准备再次进行测试。 删除数据库中的所有条目,然后创建一个新用户。 检查CloudKit仪表板以确保它们在那里。 然后长按图像将其删除。 删除后,再次检查您的CloudKit仪表板以确保其正常工作!

Just when I thought I was winning, my daughter came up with a few more issues:

就在我以为自己要赢的时候,女儿又提出了一些问题:

  • You don’t have the means to block your old Best Friend Forever (BFF) who has become your new Worst Enemy Ever (WEE).您没有办法阻止已成为新的最差敌人(WEE)的老永远朋友(BFF)。
  • It would be good to be able to hide a name completely if you never want to accidentally even talk to them.如果您永远也不想与他们交谈,永远可以完全隐藏一个名字。
  • It is a little bit annoying that there is constantly a badge on the icon!有点烦人的是,图标上总是有徽章!

The last point belongs in an earlier chapter. I think I’ll need to address it eventually. For now, we’ll tackle the other two in CloudKit.

最后一点属于前面的章节。 我认为我最终需要解决。 现在,我们将在CloudKit中解决另外两个问题。

But before we try and solve them, a few words on CloudKit errors. At this point, we’re reporting all the errors in the raw to the user. Most of them will either never fire or do so rarely. It hardly makes sense to spend too much time on them (but don’t say that when you submit your app to Apple). I can get a list of errors directly from the source code by looking at CKError.h, although it is almost as easy to get one by using a case statement like this. At the time of writing, there were 34 errors within CloudKit.

但是在尝试解决它们之前,请先谈谈CloudKit错误。 此时,我们正在向用户报告原始数据中的所有错误。 他们中的大多数人将永远不会开火或很少开火。 在它们上花太多时间几乎没有道理(但是,当您将应用程序提交给Apple时不要这么说)。 通过查看CKError.h ,我可以直接从源代码中获取错误列表,尽管使用这样的case语句获取错误几乎一样容易。 在撰写本文时,CloudKit中存在34个错误。

Obviously, many of these errors are closely linked to specific calls and setups. A few are generic. For example, we might see networkFailure or networkUnavailable with any of our calls to CloudKit. An example of a more specific error might be quotaExceeded when you’re trying to save data to the cloud, for example. On very rare occasions, you might even get an internalError, which is Apple’s way of saying something went wrong and I have no idea what it is. I confess recovering from these is really beyond the scope of this article. I concede that I have failed.

显然,这些错误中有许多与特定的调用和设置密切相关。 一些是通用的。 例如,我们可能会看到networkFailurenetworkUnavailable任何我们CloudKit电话。 例如,当您尝试将数据保存到云时,可能会出现一个更具体的错误示例: quotaExceeded 。 在极少数情况下,您甚至可能会收到一个internalError ,这是Apple所说的出问题的方式,我不知道它是什么。 我承认从这些问题中恢复确实超出了本文的范围。 我承认我失败了。

第十二章 (Chapter 12)

We’re not done with CloudKit yet, but I think we’ve covered most of the quick wins. This is what we have left:

我们还没有使用CloudKit,但是我认为我们已经涵盖了大多数快速胜利。 这就是我们剩下的:

  • Need to block my BFF who has turned on me.需要阻止打开我的BFF。
  • Hide my account too so that there is no chance I will accidentally get invited and accept my way into my WEE group.也隐藏我的帐户,这样就不会有偶然的机会邀请我接受我加入WEE小组的方式。
  • Figure out how to know who is who if you have two users with the same name.如果您有两个具有相同名称的用户,请弄清楚如何知道谁是谁。
  • Set up a private group so I can talk with a select group of friends only.设置一个私人小组,这样我只能与选定的一群朋友聊天。
  • Do some input checking for goodness’s sake.出于善意,请进行一些输入检查。

Five more issues. Let’s try and solve them.

还有五个问题。 让我们尝试解决它们。

Having authorized your BFF to send you notifications, we need a different method to block them if they turn on you. Let’s add a pull-down menu to every message that is sent so that you can block the user who sends it if they get nasty.

授权您的BFF向您发送通知后,我们需要采用其他方法来阻止它们(如果它们打开了您)。 让我们在发送的每条消息中添加一个下拉菜单,以便您可以阻止发送讨厌消息的用户。

A great refresher: Edit your appDelegate, scroll down to the registerCategories, and add a new one. I included the entire method for good measure. Note the new lines at the end. Make sure you change the category here:

很棒的复习:编辑appDelegate ,向下滚动到registerCategories ,然后添加一个新的。 我包括了整个方法,以作很好的衡量。 注意最后的新行。 确保在此处更改类别:

Move up a little in the same file and add a new action to the didReceive userNotificationsCenter method:

移一点在同一个文件,并添加新的动作到didReceive userNotificationsCenter方法:

Click on the info.plist in content extensions and add the new category you added to the code there with a second NSExtension:

单击内容扩展中的info.plist ,然后使用第二个NSExtension将您添加到代码中的新类别添加到其中:

Now edit your RemoteNotifications.swift and change the save message so that it now belongs to the new category and has that all-important content-available tag in there. It should now look like this:

现在,编辑您的RemoteNotifications.swift并更改保存消息,使其现在属于新类别,并在其中具有所有重要的content-available标签。 现在看起来应该像这样:

OK, you should be able to test again. Compile everything, add a few users if you haven’t, and authorize them to send each other messages. Having done so, send a message and check the pull-down. There should be an option to block them. That is 1/4 of the work done.

好的,您应该可以再次测试。 编译所有内容,如果还没有,请添加一些用户,然后授权他们互相发送消息。 这样做后,发送一条消息并检查下拉菜单。 应该有一个阻止它们的选项。 那是完成工作的1/4。

Hopefully, that works for you too. Now edit your storage.swift file. We need to add a method and tweak another. Find the searchNReturn and put this new version in place. Make sure you change the call you have in ContentView.swift to reflect the additional parameter. You need return as an action in it among the original calls:

希望这对您也有用。 现在编辑您的storage.swift文件。 我们需要添加一个方法并进行调整。 找到searchNReturn并放置新版本。 确保更改ContentView.swift的呼叫以反映其他参数。 您需要在原始调用中将return作为操作之一:

Now move to the bottom of the file and add a new update method you just referenced in your new searchNReturn:

现在,移至文件底部,并添加一个新的更新方法,该方法刚刚在新的searchNReturn引用:

Go back to the appDelegate and add a second call to the new method under the block action. It should now look like this. Note the second parameter is block this time:

返回到appDelegate并在block动作下添加对新方法的第二次调用。 现在应该看起来像这样。 请注意,第二个参数这次是block

Edit the RemoteNotification and add the token to the message too:

编辑RemoteNotification并将令牌也添加到消息中:

Finally, log into CloudKit and add a new field to your directory record schema. Call it block. The schema should look like this at this point:

最后,登录CloudKit并将新字段添加到您的目录记录架构。 称它为block 。 此时,架构应如下所示:

Now you’re ready to run again. Recompile the app on two different devices and try and send a message from one to the other. Once you get the authorization handshake sorted, send a message and then try blocking it. Having done so, log into CloudKit and check that the correct record was updated! That is 1/2 of the job done.

现在您可以再次运行了。 在两个不同的设备上重新编译该应用,然后尝试将消息从一个发送到另一个。 获得授权握手后,发送一条消息,然后尝试阻止它。 这样做后,登录CloudKit并检查是否更新了正确的记录! 那是完成工作的1/2。

Stop, stop, stop! I discovered a bug here. I forgot that it seems to add the final code to save the authorize method in an earlier chapter. The line you’re looking for in the Storage.swift file is this one. Yours will be a little different. Change it. You need to change the declaration for shortProtocol too:

停,停,停! 我在这里发现了一个错误。 我忘记了似乎在最后一章中添加了最终代码来保存authorize方法。 您要在Storage.swift文件中查找的这一行是这一行。 您的会有所不同。 更改。 您还需要更改shortProtocol的声明:

DispatchQueue.main.async { self!.shortProtocol.send() }

Beyond that, you need to add some code into the ContentView.swift file to capture the message:

除此之外,您需要向ContentView.swift文件中添加一些代码以捕获消息:

.onReceive(cloud.shortProtocol) { ( _ ) inself.disableText = false}

That should acknowledge authorizations once done.

完成后应确认授权。

Good, back to CloudKit — our favorite subject. But wait, we need to slow down a little. The notification extensions we used get very little time to run, and it isn’t going to be feasible to try and look up records on CloudKit when they run. We need a different plan. We can use userDefaults to save the blocked devices. Edit Storage.swift again and add this code to the updateRex3 method. We want to save the device ID to an array of blocked devices and indeed write some methods to check if a token is blocked.

好,回到CloudKit-我们最喜欢的主题。 但是,等等,我们需要放慢一点。 我们使用的通知扩展几乎没有时间来运行,并且在它们运行时尝试在CloudKit上查找记录是不可行的。 我们需要一个不同的计划。 我们可以使用userDefaults保存被阻止的设备。 再次编辑Storage.swift并将此代码添加到updateRex3方法。 我们希望将设备ID保存到被阻止设备的数组中,并确实编写一些方法来检查令牌是否被阻止。

Now we can check if a device is on the blocked list in this method in our appDelegate, although it will only stop notifications from arriving when we’re running the app in the foreground. This, I fear, is a limitation of iOS 13…

现在,我们可以在appDelegate此方法中检查设备是否在阻止列表中,尽管它只会在前台运行应用程序时阻止通知到达。 我担心这是iOS 13的局限性…

To stop notifications from coming in the background, we’ll need to stop them at the source. We need to stop the notifications from being sent in the first place. To that end, we can use another silent notification. Edit RemoteNotifications.swift and add this new method to it:

要阻止通知进入后台,我们需要在源头停止通知。 我们首先需要停止发送通知。 为此,我们可以使用另一个静默通知。 编辑RemoteNotifications.swift并向其中添加此新方法:

Then go back to the appDelegate and find our block action, edit it, and add this method to the mix. I’ve posted all the code in the action so that you can see the big picture:

然后回到appDelegate并找到我们的阻止动作,对其进行编辑,然后将此方法添加到混合中。 我在操作中张贴了所有代码,以便您可以看到大图:

Now move up to the didReceiveRemoteNotification method and add this action to it:

现在移至didReceiveRemoteNotification方法并向其中添加此操作:

if request == "block" {cloud.saveBlockedTokenToSharedmemory(token2B: device!)}

Finally, you need to reference the tokenIsBlocked method in the Storage.swift file to ensure that the directory listing routines are using it:

最后,您需要在Storage.swift文件中引用tokenIsBlocked方法,以确保目录列表例程正在使用它:

I have also re-coded the initial private/public directory listing methods in the Storage.swift file to use this new method:

我还重新编码了Storage.swift文件中的初始私有/公共目录列表方法,以使用此新方法:

Now having done all that, you can compile, run, and test it again. When you get a message, it should give you the option to pull it down and block the user. But be warned: Once blocked, they can never be restored — at least that is where we are at this point. Blocked users are also skipped when it loads the directory. That is 3/4 of the job done. How to unblock users once blocked is the subject of 4/4, and I haven’t come up with a solution yet. Maybe in Chapter 13.

现在已经完成了所有操作,您可以再次编译,运行和测试它。 当您收到一条消息时,它应为您提供将其下拉并阻止用户的选项。 但请注意:一旦被阻止,它们将永远无法恢复-至少这是我们目前所处的位置。 加载目录时,也会跳过被阻止的用户。 那是完成工作的3/4。 一旦被阻止,如何解除对用户的阻止是4/4的主题,而我还没有提出解决方案。 也许在第十三章。

I don’t know about you, but my head is spinning. I think we need to rest before the next chapter.

我不认识你,但我的头在旋转。 我认为我们需要在下一章之前休息。

翻译自: https://medium.com/better-programming/building-your-own-wotsapp-part-6-99453e93fa99

构建开发环境 构建demo


http://www.taodudu.cc/news/show-4473380.html

相关文章:

  • 华研c语言从入门到精通,2020考研答案_ 2018年12月英语六级答案【三套全】(华研外语版)_沪江英语...
  • win10“任务栏图标取消固定,重启后又出现”解决办法
  • 一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。
  • Linux下kill -9杀不死进程或杀死又自动启动,解决
  • 7-35 猴子吃桃问题 (15 分) 一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到
  • 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。到第10天早上时,只剩下一个,求第一天有多少桃子。
  • phpStudy解决mysql 启动后又自动关闭问题方法
  • K8S中删除pod,又被重新创建的问题解决
  • win10 windows update禁用后又自动开启
  • 计算机玩游戏 突然黑屏 又亮了,显示器黑一下又亮了怎么回事?解决显示器黑屏一会又亮一会又黑...
  • 解决CentOS7(无限登录)登录后又跳转到登录页面的问题
  • Vue - Ant Design Vue 中 <a-select> 选择器组件,既可从下拉列表选择,又可输入手动输入文本(既可下拉选择又可自己输入)
  • 接受offer又不去入职,需要承担啥责任嘛?
  • `spyder总是闪退?spyder打不开?spyder又又又又又出错啦?
  • 删除文件过一会又回来_内存卡数据删了又自动回来怎么回事
  • 又是面试题?对,合并有序序列。
  • 华为又一重磅APP永久下线。网友:太难了……
  • python实验总结心得体会_山东省实验学子在“2020未来太空学者大会中国区终选赛”中获佳绩...
  • 第九周周总结
  • 福布斯30岁以下30强名单新出炉!区块链从业者占比13%
  • 2020-10-18大二第七周
  • 胡润首次发布《2019胡润全球独角兽榜》,11家区块链公司入选!
  • 嘉楠科技任命成进为首席财务官:高管变动频繁,多名核心股东减持
  • 上市早不如巧,深度剖析嘉楠“两个第一”的内涵
  • 嘉楠往事
  • apt apt-get_Windows用户准备好进行apt-get吗?
  • php 小程序 运动步数_【小程序+ thinkphp5】 获取微信运动数据
  • 互联网月饼大赏,你最喜欢哪家的?
  • python和office_微软再出神器,这次终于对Python下手了!
  • win7命令启动计算机管理,关于Win7中运行的命令

构建开发环境 构建demo_构建自己的wotsapp第6部分相关推荐

  1. 构建开发环境 构建demo_科技构建了我们的现实

    构建开发环境 构建demo 重点 (Top highlight) What Stories Are True in Your Universe? Examining the words of the ...

  2. 构建开发环境 构建demo_构建自己的wotsapp第1部分

    构建开发环境 构建demo I should start this article with a disclaimer: It is based on iOS 13, Swift 5, and Xco ...

  3. Lightly 自动构建开发环境

    对一般的编辑器或集成开发环境而言,由于系统不同以及依赖出现差异,许多人往往面临开发好的项目在部署或协作时,面临功能失常的情况. 通常,构建开发环境耗时长达数小时.以团队协作为例,项目组加入新成员时,往 ...

  4. 利用Docker构建开发环境

    最近接触PAAS相关的知识,在研发过程中开始使用Docker搭建了自己完整的开发环境,感觉生活在PAAS时代的程序员真是幸福,本文会简要介绍下Docker是什么,如何利用Docker来搭建自己的开发环 ...

  5. 生死簿后台管理系统(一)——使用Docker构建开发环境

    最近有个段子非常火,说有个程序员梦见自己被阎王召见,让他帮忙开发一个后台管理系统.在一笑而过之后,我觉得如果要是能把这个系统做出来,应该颇具娱乐性,也顺便了解一下高并发以及大数据的相关技术--每天要上 ...

  6. iPhone Three20软件引擎之构建开发环境与HelloWorld

    1:原文摘自:http://blog.csdn.net/xys289187120/article/details/7017432 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址: ...

  7. java手机游戏开发如何_用JAVA开发手机游戏需要如何构建开发环境?

    使用NetBeans进行J2ME开发 1.首先安装jdk-6-windows-i586.exe软件,路径假设为D:\java\jdk1.6.0. 安装过程系统会自动再安装一个虚拟环境路程:D:\jav ...

  8. 构建JSE 开发环境(图文并茂)

    前言 学习 Java 程序设计,同样需要方便易用的开发工具.Java 的开发工具很多,而且各有优缺点,初学者往往不知道有哪些常用的开发工具,或者由于面临的选择比较多而产生困惑. 要建立 Java 开发 ...

  9. XamarinForms教程构建XamarinForms开发环境

    构建XamarinForms开发环境 所谓Xamarin.Forms的开发环境,就是指在基本硬件和数字软件的基础上,为支持系统软件和应用软件的工程化开发和维护而使用的一组软件,简称SDE.对于任何的程 ...

最新文章

  1. python3.7源码分析-集合(set)
  2. 单例设计模式-序列化破坏单例模式原理解析及解决方案
  3. python3安装过程中出现的ssl问题,No module named _ssl或者renaming “_ssl“ since importing it failed
  4. 原来历史人物的英文名竟然叫这些,太好笑了吧哈哈哈哈哈
  5. java boolean转int,java如何将int转换为boolean
  6. 电脑太慢了最简单的办法怎么弄_电脑感染病毒的10种症状及简单处理办法 电脑中病毒的症状介绍...
  7. 全球智能家居市场发展现状及未来趋势分析
  8. 分享些我见到的听到的各种创业经历(有成功也有失败)——分析下创业成功要做到哪些...
  9. 说出来你可能不信,内核这家伙在内存的使用上给自己开了个小灶!
  10. 推荐四款实用的局域网文件夹同步工具
  11. How fast is a C++ extension by the PHP-CPP liberary?
  12. 如何开启BBR算法优化ss
  13. [渝粤教育] 南京中医药大学 诊断学技能训练 参考 资料
  14. 数码相框(十六、LCD显示JPG格式图片)
  15. webstorm打开项目不显示文件夹
  16. wubi安装Ubuntu正确方法及无限等待下载amd64.tar.xz解决方法
  17. Signal:python用信号处理程序的机制及用法举例
  18. macOS 开发 - XPC
  19. SAR ADC 介绍 核芯CL1606/CL1689/CL1680 替代AD7607/AD7689/AD1980
  20. AI回合制游戏,过程比较简单。程序中的f变量和条件语句用的很经典。

热门文章

  1. 扫一扫跳转到微信非官方网页提醒页面解决方案
  2. 09最新XP系统大全(可下载)
  3. 如何正确选择电磁流量计
  4. Facebook把服务27亿人的AI硬件系统开源了
  5. 为什么IPv6显示无网络访问权限
  6. C++ [-Wreturn-local-addr] 局部变量的幽灵 在内存游荡
  7. C++ 传参时传内置类型时用传值(pass by value)方式效率较高
  8. 算法 2.二进制加法
  9. Java实现给图片局部打马赛克
  10. 形容长得丑的30句经典句子