是否有人有使用经验的CloudKit选项DeleteSelf了CKReference?这是我从文档中得到的:
DeleteSelf
引用记录的删除操作.删除记录还会删除包含指向该记录的CKReference对象的所有记录.删除附加记录可能会触发更多记录的级联删除.删除在默认区域中是异步的,在自定义区域中是立即的.
所以我一直在测试这个,我创建了多个CKReference对象,使用CloudKit Dashboard和使用我的应用程序.每当我使用我的应用程序执行此操作时,我都会像这样创建引用:
let reference:CKReference = CKReference(recordID: savedFriend.friendID, action: CKReferenceAction.DeleteSelf)
Run Code Online (Sandbox Code Playgroud)
我必须做错事,因为无论何时我去手动删除使用仪表板引用的记录,或者设置我的应用程序以编程方式删除它,记录都会消失,但引用永远不会被删除.我想也许我应该等待,它最终会发生,但几小时后它仍然在那里检查,就像它本应该删除自己.这有点令人沮丧,因为我设计了一些我的代码,假设这可以工作,现在我可以有一个浪费资源的应用程序试图找到一个CKRecord不再存在的.我应该不依靠这个来工作吗?我感谢任何帮助或建议.
更新〜04/07/2016
我跳了回来,并发布了一个更新,问题已经解决了.我并不完全相信这个问题不会重新出现,所以我昨晚寻求一些保证.我创建了5个不同的,CKRecords并创建了各种不同的CKReference对象,以便在我的数 然后我继续为CKReferenceAction.DeleteSelf每个引用设置选项(我通过仪表板手动尝试了两个,其他三个以编程方式完成).无论如何,我等了几分钟然后删除了引用的记录......十分钟后,引用仍然存在.我又等了5-10分钟,他们还在那里,所以我上床睡觉,假设早上他们肯定要走了,对吧?错误!12个小时后,CKReference条目仍在那里,引用的记录仍然没有.我肯定是在挠头,似乎这是一个错误CloudKit.我应该提一下,我也注意到我的仪表板中有一些奇怪的行为.在过去的四天左右,在左下角,它一直表示它是"重新索引开发数据",这里是一张图片,例如:

这会导致这个问题吗?有人熟悉这个问题并知道解决这个问题的方法吗?任何建议,将不胜感激.我已经向Apple提交了一份错误报告.
是否可以使用Swift CKRecord在一个CloudKit操作中保存多个对象?我知道如何一次检索多个记录,使用类似CKFetchRecordsOperation甚至只是常规的东西performQuery.我刚刚意识到我不确定在一次操作中保存多个新记录的方法.到目前为止,我一直这样做的方式对我来说似乎效率低下.例如:
let recordsToSave:[CKRecord]!
for newRecord in recordsToSave {
if let database = self.publicDatabase {
database.saveRecord(newRecord, completionHandler: { (record:CKRecord?, error:NSError?) in
// Check if there was an error
if error != nil {
// There was an error, handle it properly.
}
else {
// There wasn't an error
if let savedRecord = record {
// Handle saved record accordingly.
}
}
})
}
Run Code Online (Sandbox Code Playgroud)
虽然这确实很好用,但在我看来它似乎效率极低.我认为让一个特定的函数调用来保存整个数组会更有意义CKRecords,而不是每次都要通过循环调用数据库.基本上这就是我希望我能做到的:
let recordsToSave:[CKRecord]!
if let …Run Code Online (Sandbox Code Playgroud) 好的,所以我遇到一个令人沮丧的问题,我希望得到一些帮助或建议.基本上我有一个我正在开发的应用程序,Core Data用于存储众多用户属性.我在开发过程中几个月来一直在做的是,managedObjectContext每当用户从活动状态转换到后台时,我都会保存.我使用了一些后台获取请求,所以我被告知要专门使用applicationDidEnterBackgroundin AppDelegate而不是applicationWillTerminate函数.基本上我正在做类似的事情:
func applicationDidEnterBackground(application: UIApplication) {
if !userSaved {
saveUserDataLocally()
}
}
func saveUserDataLocally() {
// Handle all the data, store it properly in managedObjectContext
// .........
// .......
do {
try managedObjectContext.save()
print("Success on save")
} catch let error {
print("Error saving user \(error)")
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我通过xCode在我的iPhone上测试应用程序时,这已经好几个月了.每当我将应用程序推入后台时它仍然可以正常工作,并等待几秒钟以保存managedObjectContext到完成(如果存储了大量数据,有时可能需要3-4秒).只有当我通过xCode测试应用程序时才会出现问题.因此,如果我在手机上安装了应用程序,并且只是在乘坐公共汽车去学校时尝试测试,我会遇到问题.当我将应用程序推入后台模式时,它只会导致崩溃,然后立即点击主屏幕上的应用程序图标再次启动它(好像我不小心点击了主页按钮将其推入后台).如果我没有通过xCode测试并尝试强制退出应用程序,情况也是如此.在这种情况下,它不会崩溃,因为应用程序没有运行,但它永远不会完成保存.
我已经不知疲倦地尝试重新解决这个问题,同时让我的手机插入我的电脑并通过xCode进行测试,这样我就可以安装断点并找到问题的根源.通过xCode进行测试时,此问题始终存在.当我测试它时,我可以将应用程序推送到后台,然后半秒后将其重新启动,不仅原始保存请求完成,而且不会导致崩溃.此外,我可以强制退出应用程序,同时通过xCode运行它,它将允许保存完成,然后应用程序将终止.
我确信你可以想象,这是非常令人沮丧的,因为如果我在使用xCode提供的调试工具时无法重新创建问题,我很难找到错误的来源.只是明哲保身,我确信无数次,没有什么是被称为在AppDelegate的applicationWillEnterForeground或applicationDidBecomeActive方法.我完全迷失了.在我看来,通过将应用程序推回到前台,同时处于保存状态managedObjectContext,它会变得混乱和崩溃...但是当我在使用xCode测试我的设备上的应用程序时,为什么不会发生这种情况?
任何人都可以帮我吗?我可能在几个小时内没有留下任何头发!;-)
||| 更新06/03 |||
所以在一些评论者的帮助下,我能够发现问题的一部分是由于CoreData请求堵塞主线程,然后导致应用程序停止响应.我不确定这是我具体问题的确切解决方案,但绝对有助于完全识别问题.转换到后台时我试图完成所有保存的原因之一是因为我在主线程上执行了所有保存,当我在应用程序使用期间执行保存时,会导致延迟或陷入困境主线程.我一直在尝试在后台线程上执行保存执行,这非常有帮助.这样,我可以在应用程序的其他部分运行时将我的用户数据保存在后台,并且它不会阻塞主线程.这有助于使我在转换到后台时甚至不需要保存,因此崩溃不会再发生了.
我CoreData在mainthread.com上找到了一个名为Justin …
因此,我正在尝试通过HackerRank的测试用例样本为编码采访做好准备.如果您熟悉该过程,通常会采用具有各种字符串的标准输入,并根据问题的要求提取信息.我遇到过很多问题,他们会给你一行(作为a String),用n空格分隔整数(即1 2 3 4 5).为了解决这个问题,我需要从a中推断一个Int([Int])数组String.我想出了这个漂亮的方法:
func extractIntegers(_ s: String) -> [Int] {
let splits = s.characters.split { [" "].contains(String($0)) }
return splits.map { Int(String($0).trimmingCharacters(in: .whitespaces))! }
}
Run Code Online (Sandbox Code Playgroud)
所以我在我的Playground中对它进行编码并且它工作得非常好,我甚至运行了多个我组成的测试用例,并且它们都以漂亮的颜色传递......然后我将代码复制到HackerRank并尝试运行它以供提交.我得到了这个:
solution.swift:16:29: error: value of type 'String' has no member 'trimmingCharacters'
return splits.map { Int(String($0).trimmingCharacters(in: .whitespaces))! }
Run Code Online (Sandbox Code Playgroud)
所以......好吧,HR还没有为Swift 3更新所有东西.没什么大不了!我有一个更清洁的解决方案的想法!这里是:
func extractIntegers(_ s: String) -> [Int] {
return s.components(separatedBy: " ").map { Int($0)! }
}
Run Code Online (Sandbox Code Playgroud)
...... AAAAANDDD当然:
solution.swift:15:12: error: value of type …Run Code Online (Sandbox Code Playgroud) 我的搜索范围很广,无法找到我的问题的答案.为了使我们的应用程序更安全,我们被告知使用"证书固定".我们已经将Alamofire库用于所有API调用,因此使用ServerTrustPolicyManager包含作为实现证书固定的方法似乎很自然.我在我的应用程序包中包含了适当的证书,这是我用来配置SessionManagerAlamofire 的代码:
let url = "https://www.mycompany.com"
var manager: SessionManager? {
let serverTrustPolicy = ServerTrustPolicy.pinCertificates(
certificates: ServerTrustPolicy.certificates(),
validateCertificateChain: true,
validateHost: true
)
let serverTrustPolicies: [String: ServerTrustPolicy] = [
url: serverTrustPolicy
]
let config = URLSessionConfiguration.default
return SessionManager(configuration: config, serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies))
}
Run Code Online (Sandbox Code Playgroud)
现在,当我想要发出API请求时,我有这个方法:
func request(routerRequest request: URLRequestConvertible) -> DataRequest {
assert(url != "", "A base URL string must be set in order to make request")
print("URL: \(url) : \(request)")
return (manager ?? SessionManager.default).request(request)
}
Run Code Online (Sandbox Code Playgroud)
现在我遇到的问题是,当我使用类似查尔斯代理的东西时,这仍然有用......所有请求仍在进行中.证书钉扎不应该阻止像Charles Proxy这样的东西能够工作,因为证书不匹配吗?
我已经测试了其他正确使用证书固定的应用程序,它们会阻止任何类型的代理(Charles或其他)建立连接.如果我在启用Charles时尝试运行像Uber或我的Wells …
我需要一些帮助来学习如何通过提取记录来正确处理错误CloudKit.目前我有一个应用程序可以在云中保存大量记录,并在启动时加载它们.我一直在使用a引用记录CKReference,并且每次保存引用时我都会使用该CKReferenceAction.DeleteSelf选项.我定期遇到的一个问题是,当删除引用的记录时,有时在引用删除自身之前可能会有相当长的时间.这导致我偶尔遇到我的应用程序已获取CKReference不再存在的记录的情况.我能够通过插入print(error!)我的错误处理程序手动找出何时发生这种情况.我想知道的是我如何添加一些代码来检测这个特定的错误,即if error.localizedDescription == ??? {.这是我用于获取的基本代码:
let fetch = CKFetchRecordsOperation(recordIDs: recordIDs)
fetch.perRecordCompletionBlock = { (record:CKRecord?, recordID:CKRecordID?, error: NSError?) in
if error != nil {
// Error Line A (See below)
print("ERROR! : \(error!.localizedDescription)")
// Error Line B (See below)
print("ERROR: \(error!)")
}
else if let record = record {
// Record was found
}
}
if let database = self.privateDatabase {
fetch.database = database
fetch.start()
}
Run Code Online (Sandbox Code Playgroud)
然后当它尝试获取不存在的记录时,这是在编译器窗口中打印出来的错误消息:
一个) ERROR! …
我想知道是否有任何方式让我的WatchKit应用程序在后台运行,或者如果我可以编程启动(即从非活动状态转换到活动状态)一旦满足某个条件?
当WK应用程序处于打开和活动状态时,我的应用程序运行正常,当iPhone处于睡眠状态或父iOS应用程序处于BG模式时,它甚至可以正常运行.但是,我真的需要我的应用程序继续在手表背景上运行.这可能吗?
我对swift很新,而且我一直以编程方式完成所有编码.我终于扩展并开始使用Interface Builder学习一些很棒的东西,什么不是.
我在使用drawRect(rect:CGRect)函数创建的UIView类中创建了一些很酷的自定义绘图,现在我希望能够在循环中多次调用该类以在我的视图中进行布局.每当我尝试以编程方式实例化视图时,似乎没有调用drawRect.我没有得到任何错误,没有什么是绘画.这是我的用于布局自定义视图的代码,其中TesterView是我自定义的UIView子类,它执行自定义绘图:
func testView() {
let testerView:TesterView = TesterView()
self.view.addSubview(testerView)
testerView.translatesAutoresizingMaskIntoConstraints = false
let height = NSLayoutConstraint(item: testerView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 200)
let width = NSLayoutConstraint(item: testerView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: 200)
let centerX = NSLayoutConstraint(item: testerView, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0)
let bottom = NSLayoutConstraint(item: testerView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Bottom, multiplier: 1, …Run Code Online (Sandbox Code Playgroud)