我有一个表,类和另一个我称之为"课程"的表 - 也就是说,某个特定人在特定地方教授的课程.我想拉一个表,基本上只是根据某些课程参数向我显示哪些类是活动的.例如:
CLASSES
class_id|class_name
--------|------------
1|Class One
2|Class Two
3|Different Class
etc...
COURSES
course_id|class_id|room
---------|--------|--------
1| 3| 1
2| 3| 2
3| 1| 1
4| 3| 1
5| 3| 2
6| 2| 1
etc...
我想知道是否有一种方法可以让我只想SELECT classes.* FROM classes JOIN courses ON classes.class_id=courses.class_id WHERE courses.room=1返回每个类的一个实例.发生的事情是我只获得了在1号房间发生的课程,但我得到了每个课程的多个实例,因为在课堂1的课程表中有多个该课程的实例.
我已经尝试了各种不同的JOIN- 左,右,内等 - 而且因为我是根据另一张桌子的规格从一张桌子拉出来的,所以它们似乎都给了我相同的结果.
所以我得到了:
class_id| class_name |course_id|room
--------|--------------|---------|--------
1|Class One | 3| 1
2|Class Two | 6| 1
3|Diferent Class| 1| 1
3|Diferent Class| 4| 1
etc...
但我想得到:
class_id| class_name …
标题评论指出CKFetchDatabaseChangesOperation fetchDatabaseChangesCompletionBlock:
“如果服务器返回CKErrorChangeTokenExpired错误,则该previousServerChangeToken值太旧,客户端应该丢弃其本地缓存并重新获取此记录区域中以 nil 开头的更改previousServerChangeToken。”
我想测试这个场景,因此我想生成一个过期的,CKServerChangeToken这样我就可以将其设置previousServerChangeToken为CKFetchDatabaseChangesOperation.
我从私有标头添加了一个 init 方法:
@interface CKServerChangeToken (Private)
- (id)initWithData:(NSData *)data;
@end
Run Code Online (Sandbox Code Playgroud)
并按如下方式使用它:
CKServerChangeToken knownExpiredToken = [[CKServerChangeToken alloc] initWithData:[[NSData alloc] initWithBase64EncodedString:@"AQAAAVl57tUGHv6sgNT9EeaTcQCM+sDHHA==" options:0]];
Run Code Online (Sandbox Code Playgroud)
该字符串是从请求返回的有效更改令牌,我尝试修改它但未成功,例如将我看到的递增数字减少到较低的数字。然而,我设法得到了另一个奇怪的无效参数错误,例如缺少连续标记。如果CloudKit工程师有任何建议,我将不胜感激,谢谢。
很容易创建一个像这样的简单列表:
List { Text("Item 1") Text("Item 2") Text("Item3") }
Run Code Online (Sandbox Code Playgroud)
但是我如何添加像传统 NSTable 这样的选择?
我的 macOS SwiftUI 应用程序的内存占用量急剧增加且速度变慢。我能够创建一个最小的示例来重现。要重现,请转到 Xcode -> File -> New -> Project -> macOS -> App -> Life Cycle: SwiftUI App 并将其粘贴并替换到*App.swift
import SwiftUI
@main
struct DemoApp: App {
let timer = Timer.publish(every: 0.1, on: .main, in: .common).autoconnect()
@State var number = 0.0
var body: some Scene {
WindowGroup {
List {}
.toolbar(content: {
ForEach(1..<100) { _ in
Text(String(format: "Time elapsed: %.1f ", number))
.font(.system(.body, design: .monospaced))
}
})
.onReceive(timer) { input in
number += 0.1
}
}
}
} …Run Code Online (Sandbox Code Playgroud) 我注意到Apple的文档说我们需要在捕获self时避免强大的引用周期.
示例中的块是self的属性.
但是如果我在dispatch_async语句中将块作为局部变量放置怎么办?
在这种情况下,即使我直接调用自我方法,它也不会创建保留周期,对吧?
以下代码是否会在本文中生成weakSelf ?
// your code
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
__strong typeof(weakSelf) strongSelf = weakSelf;
if (strongSelf) {
[strongSelf doThis];
[strongSelf doThat];
[Manager.sharedInstance updateSuccessCount];
}
});
// more code
Run Code Online (Sandbox Code Playgroud) 我真的很难理解这是如何List(selection:)导致选择绑定更新的。
我正在https://developer.apple.com/documentation/swiftui/building_a_great_mac_app_with_swiftui上取消选择 Apple 示例代码
该项目是Session2/Part2-End/GardenApp.xcodeproj
左侧有一个侧边栏,右侧有主要细节视图。看起来ContentView像这样:
struct ContentView: View {
@EnvironmentObject var store: Store
@SceneStorage("selection") private var selectedGardenID: Garden.ID?
@AppStorage("defaultGarden") private var defaultGardenID: Garden.ID?
var body: some View {
NavigationView {
Sidebar(selection: selection)
GardenDetail(garden: selectedGarden)
}
}
private var selection: Binding<Garden.ID?> {
Binding(get: { selectedGardenID ?? defaultGardenID }, set: { selectedGardenID = $0 })
}
private var selectedGarden: Binding<Garden> {
$store[selection.wrappedValue]
}
}
Run Code Online (Sandbox Code Playgroud)
和侧边栏是这样的:
struct Sidebar: View {
@EnvironmentObject var store: Store
@SceneStorage("expansionState") var …Run Code Online (Sandbox Code Playgroud) swiftui ×3
macos ×2
objective-c ×2
cloudkit ×1
ios ×1
list ×1
memory-leaks ×1
mysql ×1
performance ×1
php ×1
retain-cycle ×1
selection ×1
swift ×1