制作多平台的framework
制作多平台的framework========================看图秒懂系列,Base SDK务必要设置成No SDK,选择other选项,然后什么都不填。
去除 GLKit API 弃用警告
去除 GLKit API 弃用警告========================
'GLKViewController' was deprecated in iOS 12.0: OpenGLES API deprecated. (Define GLES_SILENCE_DEPRECATION to silence these warnings)
GLKit 相关的 API 从 iOS12 之后就已经标记为弃用了。为了避免 Xcode 满屏的黄色警告⚠️,我们在 Project--Build Settings 里找到 Preprocessor Macros ,然后配置GLES_SILENCE_DEPRECATION=1即可把 OpenGLES 相关的弃用 API 警告去掉。这样 Xcode 的编辑界面就清爽很多了。
使用R.swift检查各种string文件的问题
使用R.swift检查各种string文件的问题======================== [R.swift] Skipping 2 strings in ‘Localizable’ (en) because symbol ‘bottle’ would be generated for all of these keys: bottle, bottle这个错误主要是因为你在.strings文件中有两个相同的键值对,或者两个相同的键。
"bottle " = "Langyao Straight-mouth Bottle";
"bottle " = "Langyao Straight-mouth Bottle";
"bottle " = "Bottle";
"bottle " = "Langyao Straight-mouth Bottle";
这么说起来,可以用R.swift检查各种string文件的问题,缺失,重复等问题它都会报警告。
iOS日志框架CocoaLumberjack
iOS日志框架CocoaLumberjack========================我使用了如下代码进行配置,只需在AppDelegate或SceneDelegate调用configDDLog即可(在其他某些文件配置也是可以的)
//
// configDDLog.swift
// RunInto
//
// Created by 张赛东(手机:15674119605) on 2021/4/10.
// Copyright © 2021 adong666666. All rights reserved.
//
import Foundation
import CocoaLumberjack
/**
配置DDLog相关参数
*/
func configDDLog() {
// //让日志只在debug时输出
// #if DEBUG
// defaultDebugLevel = .Verbose
// #else
// dynamicLogLevel = .off
// #endif
//添加发送日志语句到苹果的日 ...
查看cocoapods中各个库的版本
查看cocoapods中各个库的版本========================
记录一下
cat Podfile.lock
Last login: Fri Apr 9 05:48:04 on ttys002
zhangsaidong@zhangsaidongs-MacBook-Pro ~ % cd /Users/zhangsaidong/Desktop/project/CommonlyUsed/RunInto-Apple/RunInto/RunInto
zhangsaidong@zhangsaidongs-MacBook-Pro RunInto % cd ..
zhangsaidong@zhangsaidongs-MacBook-Pro RunInto % cat Podfile.lock
PODS:
- Alamofire (5.4.1)
- ARVideoKit (1.6.0)
- BarcodeScanner-custom (5.1.4)
- ColorSlider (4.4)
- Crashlytics (3.14.0):
- Fabric ...
Zip使用
Zip使用========================
感觉官方写得挺明白的
do {
let filePath = Bundle.main.url(forResource: "file", withExtension: "zip")!
let unzipDirectory = try Zip.quickUnzipFile(filePath) // Unzip
let zipFilePath = try Zip.quickZipFiles([filePath], fileName: "archive") // Zip
}
catch {
print("Something went wrong")
}
do {
let filePath = Bundle.main.url(forResource: "file", withExtension: "zip")!
let documentsDirectory = FileManager.default.urls(for:.documentDirectory, in: .userDomainM ...
iOS mlmodelc内部文件格式规范
iOS mlmodelc内部文件格式规范========================尽量本地编译Core ML mlmodel,则得到的mlmodelc可以直接使用
通过网络加载的Core ML mlmodel所编译而出的mlmodelc虽说内容一致,但格式不方便直接使用,而且……最重要的是,网络加载的mlmodel至少还要再编译一次,相当于在App内占用了两个模型的体量。而且有可能需要重复编译多次,即占用多个模型的体量,如果还不注重清理的话,App的体量会越来越大,而且内部数据还大量重复,因为编译出来mlmodec不能直接使用(你可以在代码里调整模型的内部格式,但是这也太麻烦了,对不同模型还得不同处理)
所以建议使用mlmodel本地编译出来后的mlmodelc,你可以在Products中的.app文件夹中右键显示包内容找到编译后的mlmodelc文件
iOS延时
iOS延时========================
今天我使用了这样一种延时,目的是等待文件下载完,返回与文件相关的数据,我试了各种多线程,后面发现这种延时有阻塞的味道,能有效地防止函数提前返回数据
while true {
if let compiledModelURL = try? MLModel.compileModel(at: url) {
} else {
Thread.sleep(forTimeInterval: 2)
continue
}
break
}
这种延时不能起到阻塞作用,也不能防止函数提前返回,但是它可以等待一定时间后执行某种操作。
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
let view = UIViewController.getCurrentViewController()?.view
view?.hideToastActivity()
view?.hideAllToasts()
}
下面是网上 ...
iOS调试摘录
iOS调试摘录======================== po vo do 等调试命令可以了解下
iOS_Swift文件夹和文件操作
iOS_Swift文件夹和文件操作========================
首先获取app文件夹:(以下例子都在doucment文件夹下操作)
let manager = FileManager.default
let urls: [URL] = manager.urls(for: .documentDirectory, in: .userDomainMask)
// .libraryDirectory、.cachesDirectory ...
self.documentURL = urls.first!
创建文件夹let url = self.documentURL.appendingPathComponent("moxiaoyan", isDirectory: true)
var isDirectory: ObjCBool = ObjCBool(false)
let isExist = manager.fileExists(atPath: url.path, isDirectory: &isDirectory)
if !isExist {
do {
tr ...
Swift字符串截取摘录
Swift字符串截取摘录========================
Swift 解决URL或参数中含有中文(Swift URL编码)
Swift 解决URL或参数中含有中文(Swift URL编码)========================
let encodeURLStr = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
let url = URL.init(string: encodeURLStr)
static func get( _ url: String, parameters: [String: Any] , completionHandler: @escaping (NSError?, JSON) -> Void) {
var urlStr = url
var flag = true
let generalDelimitersToEncode = ":#[]@" // does not include "?" or "/" due to RFC 3986 - Section 3.4
let subDelimitersToEncode = ...
从网络下载文件到App
从网络下载文件到App========================
func downloadModels(_ path: [String], modelUrl: String) {
DispatchQueue.global().async {
for str in path {
let urlString = modelUrl + str
let encodeURLStr = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
log(encodeURLStr)
let url = URL.init(string: encodeURLStr)
log(url)
let request = URLRequest(url: url!)
let downloadTask = URLSession.sha ...
JSON解析摘录
JSON解析摘录========================
Kingfisher简单使用
Kingfisher简单使用========================
UIKitlet url = dataShare.queryFromManyTable(with: modelName, from: [dataShare.cuturalRelicsIntroduction,
dataShare.models3DIntroduction,
dataShare.paintingModelsIntroduction])?.image
objectImageView.kf.indicatorType = .activity
objectImageView.kf.setImage(with: URL(string: url))
...
Swift高阶函数
Swift高阶函数========================
mapmapmap对于原始集合里的每一个元素, 以一个变换后的元素替换之形成一个新的集合
let results = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let allResults = results.map{ $0.map{ $0 * 10 } }
print(allResults)
输出结果
[10, 20, 30, 40, 50, 60, 70, 80, 90]
flatMapflatMap对于元素是集合的集合, 可以得到单级的集合
let results = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
let allResults = results.flatMap{ $0.map{ $0 * 10 } }
let passMarks = results.flatMap{ $0.filter{ $0 > 5 } }
print(allResults)
print(passMarks)
输出结果
[10, 20, 30, 40, 50, 60, 70, 80 ...
Swift Self摘录
Swift Self摘录========================
Swift Package摘录
Swift Package摘录========================