我在市场上有几个iOS应用程序,在所有这些应用程序中,我有一个连接到应用程序的小型SQLite数据库文件,为用户提供我的数据.安装后,用户可以通过更改某些选项来自定义此DB.
到目前为止,所有这些应用程序都存储了数据库NSDocumentsDirectory.提交我的上次更新后,它被拒绝将数据存储在错误的位置.对于被拒绝的应用,我将存储位置更改为NSCachesDirectory.我现在担心缓存将被清除并删除用户自定义.该应用程序仍然可以运行,数据库将被重新创建,但所有更改的表都将被重置,从而扰乱用户.
这种类型的数据库文件应该存储在何处?我把它放在Docs目录中是对的吗?根据Apple的说法,Docs目录是针对"关键数据",它是用户生成的数据或正确运行应用程序所需的数据.我觉得它属于那个类别,坚持我的用户设置是正确的操作,但谁想等待上诉?
在面向 Android 13 (SDK 33) 的 Android 应用中,我已在应用清单中声明了所需的 AD_ID 权限:
<uses-permission android:name="com.google.android.gms.permission.AD_ID"/>
但是,当我将应用程序上传到播放控制台以进行发布时,会弹出以下错误,建议我需要声明权限。
Error
Your declaration on Play Console says that your app uses advertising ID. Your manifest file doesn't include the com.google.android.gms.permission.AD_ID permission.
If you don't include this permission in your manifest file, your advertising identifier will be zeroed out. This may break your advertising and analytics use cases, and cause loss of revenue. Learn more
You can remove these errors by updating your advertising ID declaration
info_outline
Apps …Run Code Online (Sandbox Code Playgroud) 在 iOS 15 的 Xcode 13 beta 中,我收到一条消息,称perform(_:inZoneWith:completionHandler:)(CloudKit) 在 iOS 15 中已弃用并重命名为fetchRecords(matching:inZoneWith:desiredKeys:resultsLimit:completionHandler:)“但是...”
Apple 文档网站未声明此方法已弃用:https://developer.apple.com/documentation/cloudkit/ckdatabase/1449127-perform
Apple 正在展示 iOS 15 的其他弃用(另一种方法):https://developer.apple.com/documentation/cloudkit/ckdatabase/3794331-records/
fetchRecords(matching:inZoneWith:desiredKeys:resultsLimit:completionHandler:)似乎不存在..还..( Value of type 'CKDatabase' has no member 'fetchRecords')
那么,这是否只是一个错误消息,因为它是测试版?我应该担心重写使用的函数perform(_:inZoneWith:completionHandler:)吗?
这是我的函数,我尝试将其改编为 fetchRecords,但它不存在。我尝试适应它,fetch(withQuery:completionHandler:但我有点迷失让它发挥作用..
(该函数只是从iCloud私有数据库中删除记录):
let container = CKContainer(identifier: "MyContainerNameHere")
let recordType = "DBName"
//delete all saved icloud records
let query = CKQuery(recordType: recordType, predicate: NSPredicate(value: true))
container.privateCloudDatabase.perform(query, inZoneWith: nil) { (rec, err) in
if let err = err {
print(err.localizedDescription) …Run Code Online (Sandbox Code Playgroud) 我对如何处理复杂的 Swift 数据类型、它们对变量的赋值以及访问其中的值有点困惑。希望有人能澄清以下问题:
当尝试从 SwiftUI 和 CloudKit 获取数据,并尝试重写 CK 函数以符合 async/await 时,我有以下代码行:
let result = try await container.privateCloudDatabase.records(matching: query)
现在这一行应该从云私有数据库中获取与指定查询匹配的所有记录并返回一些 CKRecords
旧函数的执行方式如下:
container.privateCloudDatabase.perform(query, inZoneWith: nil) { (rec, err) in
for record in rec {
print("Found this record: \(record)")
}
}
Run Code Online (Sandbox Code Playgroud)
这非常有效,因为perform(_:inZoneWith:)会返回一个 CKRecord 和一个错误,它们在语句中被“分开”(rec, err) in并传递到循环中进行迭代。
使用新的 async/await 方法,我尝试简单地等待并将变量分配给找到的所有记录,然后迭代返回的数据,挑选 CKRecords 并执行我想要的任何任务。
我感到困惑的是,当我尝试以多种方式从返回的结果中挑选数据时,我只是收到错误。我不完全理解如何描述返回值的数据结构,我认为这是问题的根本原因。
我尝试了一些方法并收到以下错误消息:
如果我尝试:
let (result, err) = try await container.privateCloudDatabase.records(matching: query)
Run Code Online (Sandbox Code Playgroud)
当我使用时(尝试将 CKRecords 附加到我之前创建的 CKRecords 数组中):
for record in result {
self.myCKRecordArray.append(record)
}
Run Code Online (Sandbox Code Playgroud)
错误消息具体指出: …
更新 #4
错误是这样的:在 SwiftUI 视图中显示 List 或 ForEach 后,如果您通过更改列出的项目数来更改该视图,则 UI 在尝试计算已更改/需要更改的行数时会锁定。 .
我在 Apple 开发论坛中看到其他人遇到过这个错误。他们的临时解决方案是“将数组设置为空白”,从而在修改列出的数据集之前彻底清除列表大约 100 毫秒。这将充分避免用户使用数据数组迭代 List 或 ForEach 时的锁定。
问题是,对于 CoreData,按照本文中的描述使用,似乎没有任何方法可以清除推送的字母之间的列表(获取请求)。
在更新 #3 中,有一个 GitHub 项目显示了此问题的示例数据。
对解决方法的任何输入表示赞赏。
更新 #3
不好.. 正如这篇文章中所述,我能够从使用 CoreData 更改为本地 SQLite 数据库文件。我的结果是搜索和使用 CoreData 一样慢。我不知道这里发生了什么。但也许它与 SwiftUI 输出的渲染结果有关?无论哪种方式,搜索和显示大量数据似乎都是不可能的。
根据 J. Doe 的要求,我在 GitHub 上发布了一个示例项目,该项目演示了这个问题。这个项目可以在这里找到
我希望有人能看到我做错了什么。我很难相信这只是 iOS 的一个限制。
原帖
有任何想法吗?
我觉得我缺少一些基本的东西。我的获取请求(下面的代码)非常慢。我试图向 CoreData 模型添加一个索引,但有负面改进(来自下面的 J. Doe 的建议)。我想也许我需要以某种方式向 fetch 请求添加一个 fetchBatchSize 声明(想通了这一点 - 请参阅下面的更新 #2 - 没有帮助),但是使用 SwiftUI 中的属性包装器 @FetchRequest,似乎没有办法做这个。 …
在观看 WWDC 21 视频参考 StoreKit 2 时,他们引用了一些函数,其中他们让值 =WindowScene如下:
func manageSubscriptions() async {
if let windowScene = self.view.window?.windowScene {
do {
try await AppStore.showManageSubscriptions(in: windowScene)
} catch {
//error
}
}
}
Run Code Online (Sandbox Code Playgroud)
let 行出错并显示以下消息:Type of expression is ambiguous without more context
如果我尝试提供更多上下文,例如:
if let windowScene = (self.view.window?.windowScene)! as UIWindowScene {
Run Code Online (Sandbox Code Playgroud)
有人告诉我:Value of type 'MyStruct' has no member 'view'
我缺少什么,必须是简单的东西才能访问这个所需的 UI 元素?
谢谢
补充: 我想补充一点,我使用的是使用 SceneDelegate 和 AppDelegate 创建的 SwiftUI 应用程序,而不是简单的结构:App,结构类型。所以我猜我需要访问 SceneDelegate 中的某些内容才能获取正确的对象。
我有两个 Modal/Popover.sheet我想根据用户按下哪个按钮来显示。我已经设置enum了不同的选项并设置了默认选项。
预期行为:
当用户选择任何选项时,将显示正确的工作表。当用户 THEN 选择其他选项时,它还会显示正确的工作表。
观察到的行为:
在下面的例子中,当用户第一次选择第二个选项时,显示第一个工作表,并将继续显示直到用户选择第一个工作表,然后它会开始切换。
调试打印显示@State变量正在更改,但是,工作表演示不会观察到此更改并按上述方式显示工作表。有什么想法吗?
import SwiftUI
//MARK: main view:
struct ContentView: View {
//construct enum to decide which sheet to present:
enum ActiveSheet {
case sheetA, sheetB
}
//setup needed vars and set default sheet to show:
@State var activeSheet = ActiveSheet.sheetA //sets default sheet to Sheet A
@State var showSheet = false
var body: some View {
VStack{
Button(action: {
self.activeSheet = .sheetA //set choice to …Run Code Online (Sandbox Code Playgroud) 在 Swift 中,我有一个 String Variable thisString。我想检查以确保字符串仅包含字母、数字和/或破折号 (-)。除了这样做之外:
if ( thisString.contains("$") || thisString.contains("%") ) {
//reject
} else {
//accept
}
Run Code Online (Sandbox Code Playgroud)
对于每个不受欢迎的角色,这很荒谬。我想不通。
理论上,我想用正则表达式做这样的事情:
if ( thisString.contains(regex([^a-zA-Z0-9-]) ) {
//reject
} else {
//accept
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?
作为我上一个问题的后续问题(Perl XML::LibXML 从特定节点获取信息)
给定以下 XML 数据,我无法弄清楚如何获取标记后显示的数据<tab/>(该标记没有结束标记,而不从该部分内的子节点获取所有数据?有关更多详细信息,请参阅下文:
XML 示例:
<title number="3">
<catchline>Uniform Agricultural Cooperative Association Act</catchline>
<chapter number="3-1">
<catchline>
General Provisions Relating to Agricultural Cooperative Associations
</catchline>
<section number="3-1-1">
<histories>
<history>
Amended by Chapter
<modchap sess="2010GS">378</modchap>
, 2010 General Session
</history>
<modyear>2010</modyear>
</histories>
<catchline>Declaration of policy.</catchline>
<tab/>
It is the declared policy of this state, as one means of improving the economic position of agriculture, to encourage the organization of producers of agricultural products into effective associations …Run Code Online (Sandbox Code Playgroud) 我一直在寻找这个问题的解决方案几天,并找到了一些类似的帖子,但似乎没有人发布一个明确的答案,如何停止我正在使用dealloc'd的实例.希望我只是错过了,或者有人可以帮助我停止摧毁我的大脑..
我有一个class(LKNetworking)声明它符合UIAlertViewDelegate协议.目前它是一个子类NSObject,但是我已经尝试UIResponder但是要么产生相同的问题.
问题是我创建了一个UIAlert视图并将委托设置为self.UIAlert视图显示OK,但是LKNetworking调用它的Class实例立即被dealloc'd(我在NSLOG中显示),当我单击一个按钮时,消息被发送到一个解除分配的实例(LKNetworking alertView:clickedButtonAtIndex:]:message发送到解除分配的实例0x6e5ce40)
所以,我试图在.h文件中创建一个属性:
@property (strong, nonatomic) LKNetworking *strongNetworkingProperty
Run Code Online (Sandbox Code Playgroud)
然后我尝试将我的UIAlertView的委托设置为strongNetworkingProperty ivar并且消息似乎无处可去,所以这没有好处..
我看到一些答案里的人说,设置警戒意见delegate来nil,但击败我的整个目的,因为我需要响应用户选择相应的行动..
以下LKNetworking是调用警报的方法的示例代码和delegate方法:
-(void)checkGameServerVersion: (float) serverGameVersion {
if (serverGameVersion == GAMEVER) {
NSLog(@"matched");
// Continue flow here..
} else {
NSLog(@"not matched");
//Game version does not match, end game, force upgrade
UIAlertView *oldVersion = [[UIAlertView alloc]initWithTitle:@"Ugrade Required" message:@"A new game version is available, Please update your game and try …Run Code Online (Sandbox Code Playgroud)