iOS + watchOS Tourism App(含源码可简单复现)

iOS-app-trip-in-HK - how to study and get the new product in 2 weeks

⚠️ 本文源码已上传到GitHub: https://github.com/boots-coder/whereWeGo

during 12. 3 - 12.17 = 14 days

ps:本人有java springboot开发和python的人工智能的基础知识背景; 但是我认为学习新技术的方法应该是一样的 ,本文记录了从0开始到一个产品落地的全过程

Day 1 确定需求和进行初步调研

目前github 主要针对的是iOS 单独的应用, 并没有和iwatch 进行深入的连接;因此该项目进行开发就有了其独特的意义;

旅游产品:携程等,广告多, 国内软件和应用冗余;希望开发一款比较干净的旅游产品

Some details :

以 china HK 为例子:

  • 以香港旅游为主要研究对象和主题
  • 酒店预定-询
  • 介绍酒店附近景点
  • apple 全设备支持(iOS-ipad-iwatch)
  • 预约之后需要有sql 日志输出

一些开源程序的搜索

序号项目名称描述GitHub 链接
1NearMe使用 SwiftUI 开发的 iOS 应用,可发现附近的地点,利用 MapKit 和 Core Location 提供交互式地图、搜索、详细地点信息和路线指引等功能。NearMe
2swiftui-hike-app基于 SwiftUI 的 iOS 应用,旨在激发用户发现和探索徒步旅行路线,展示了 SwiftUI 在创建精美卡片视图和优雅设置界面方面的能力。swiftui-hike-app
3Travel-Booking-App-SwiftUI电子商务旅行预订应用,用户可预订酒店和活动,使用 SwiftUI 开发,集成了 MapKit 和 Apple Pay。Travel-Booking-App-SwiftUI
4TravelApp-SwiftUI使用 SwiftUI 构建的旅行应用界面示例,展示了如何使用 SwiftUI 构建现代旅行应用界面。TravelApp-SwiftUI
5swift_travel开源的公共交通应用,提供路线搜索、时刻表和 AI 驱动的智能建议等功能。swift_travel
6AwesomeSwift汇集了 Swift 开源精选资源的项目,以思维导图形式呈现,包含多个旅行相关的应用示例。AwesomeSwift
7swift-open-projectSwift 开源项目分类汇总,其中包含多个旅行应用的示例和资源。swift-open-project
8awesome-swift-1汇集了 Swift 开源精选资源的文档,以思维导图形式呈现,包含旅行应用的示例。awesome-swift-1
9awesome-swiftui精心策划的优秀 SwiftUI 开源项目列表,其中包含旅行应用的示例。awesome-swiftui
10OpenSwiftUI开源的 SwiftUI 实现项目,可用于构建跨平台的旅行应用。OpenSwiftUI

经过调研,决定在标亮度的产品上做二次开发

Day 2 ,学习和入门 swift

参考:

swift官网学习导航:

https://developer.apple.com/cn/documentation/swift/?utm_source=chatgpt.com

语法特性:

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/

swiftUI:

https://developer.apple.com/cn/xcode/swiftui/

https://developer.apple.com/tutorials/swiftui/

playGround:

https://designcode.io/swiftui-handbook-visual-editor-in-xcode

Day3 ,修改项目代码

  1. 形成详细的源文件的技术报告

该开源项目“Travel-Booking-App-SwiftUI”是一个用于预订酒店和活动的电子商务旅行应用,采用 Swift 和 SwiftUI 开发,集成了 MapKit 和 Apple Pay 等技术。

项目文件结构及各文件作用:

​ • ExploreHere.xcodeproj:Xcode 项目文件,包含项目的配置和元数据。

​ • ExploreHere:主代码目录,包含应用的源代码和资源。

​ • .DS_Store:macOS 系统文件,存储文件夹的显示属性。

​ • README.md:项目的自述文件,提供项目概述、技术栈和功能说明。

项目包含的 UI:

​ • 探索活动界面:展示可预订的活动列表,用户可以浏览并选择感兴趣的活动。

​ • 购物车界面:用户添加的旅行计划和活动会显示在此,支持添加和删除操作。

​ • 详细视图界面:提供所选活动或酒店的详细信息,包括描述、位置等。

​ • 旅行计划视图:展示用户的旅行行程和相关预订信息。

使用的技术:

​ • Swift:主要编程语言。

​ • SwiftUI:用于构建用户界面的声明式框架。

​ • MapKit:用于在应用中嵌入地图功能,显示活动或酒店的位置。

​ • Apple Pay:集成支付功能,方便用户完成预订付款。

实现的主要功能:

​ • 活动和酒店浏览:用户可以浏览可预订的活动和酒店列表,查看详细信息。

​ • 添加和管理旅行计划:用户可以将感兴趣的活动或酒店添加到购物车,管理自己的旅行计划。

​ • 地图显示:通过 MapKit 显示活动或酒店的位置,帮助用户直观了解地理信息。

​ • 支付功能:集成 Apple Pay,用户可以直接在应用内完成支付,简化预订流程。

该项目采用 MVVM(Model-View-ViewModel)架构,确保代码的可维护性和可扩展性。

Day 4 转代码到 iwatch

生成图标:https://www.appicon.co/

核心问题: 数据一致性

下面是一个总体思路和示例,帮助你在 watchOS 与 iOS 间共享酒店数据,并在 watchOS 上预订酒店后,将结果同步到 iOS 的购物车中。

如果你需要更多特定信息(比如 WatchConnectivity 的详细实现、数据模型如何保持一致、或是工程文件的组织方式),请告诉我你需要哪些进一步信息,我将为你提供更详细的说明。


总体思路
  1. 数据一致性
    在 watchOS 与 iOS 间共享同一套酒店数据(Hotels 结构、hotelList数组等),确保 watchOS 和 iOS 使用相同的数据模型文件。在实际项目中,你可以把 Hotels.swiftHotelType.swift 等数据层文件放入一个 Shared 文件夹,并通过 Target Membership 同时勾选 iOS 和 watchOS,这样两端共享同一套代码。

  2. 数据同步机制
    使用 WatchConnectivity 框架来在 iOS 和 watchOS 间传递数据。当用户在 watchOS 的 DetailView 中点击注册(预订)按钮时,向 iPhone 发送一条消息包含预订酒店的信息。iPhone 端接收到该信息后,将该酒店加入 HotelType.hotelComponent,从而更新 iOS 的购物车界面。

  3. 具体步骤

    • 在 iOS 和 watchOS 的 Extension 中分别创建 WCSession 会话,并设置代理。
    • 当 watchOS 用户点击 “Register” 按钮时,通过 session.sendMessage 发送 ["action": "addHotel", "hotelID": ...] 或直接发送完整的酒店信息字典。
    • iOS 接收到后根据 ID 或信息匹配到对应的酒店对象,调用 hotelsList.addHotels(newItem:) 将酒店加入购物车。
    • iOS 上的购物车界面因为数据是 @Published,会自动刷新显示新加入的酒店。

Day 5 完善项目和进行成果展示

  • 修复数据一致性问题
  • 添加图片

下面是本次实现 Apple Watch 与 iOS App 之间数据同步功能的完整工作记录和技术总结,可作为其他开发者的参考与学习资料。


背景与目标

我们希望在 Apple Watch 上完成酒店预订操作后,将该预订信息实时同步到 iOS 端的购物车界面中。通过实现此功能,用户可以在 Apple Watch 上独立浏览并订购酒店,而 iOS App 则能自动更新购物车数据,呈现最新的订单状态。

使用技术与框架

  • WatchConnectivity:Apple 提供的框架,用于在可配对的 iPhone 与 Apple Watch 之间进行双向通信。
  • SwiftUI:构建 iOS 与 watchOS App 的 UI 界面,并使用 @EnvironmentObject@Published 属性实现数据驱动的界面更新。

实现步骤

一、项目结构与初始化
  1. 同一 Workspace 中的多 Target
    确保项目中包含 iOS App 目标和 watchOS Extension/Watch App 目标。这使得 iOS 和 watchOS 项目可以共享数据模型文件(如 HotelsHotelType),并在后续使用 WatchConnectivity 进行通信。
  2. 单独运行测试
    在实现数据同步前,先确保 iOS 与 watchOS 应用均能独立运行无误。(这一步建议分开启动,这样有利于进行调试)
二、启动与激活 WatchConnectivity 会话
  1. iOS 端会话初始化
    在 iOS App 中(App入口点,如 ExploreHereApp.swift),初始化 iOSAppSessionManager 单例,激活 WCSession

    @main
    struct ExploreHereApp: App {init() {let _ = iOSAppSessionManager.shared}var body: some Scene {WindowGroup {ContentView().environmentObject(TripType()).environmentObject(HotelType.shared) // 单例注入}}
    }
    

    iOSAppSessionManager.swift

    swiftimport WatchConnectivityclass iOSAppSessionManager: NSObject, WCSessionDelegate {static let shared = iOSAppSessionManager()let session = WCSession.defaultoverride init() {super.init()if WCSession.isSupported() {session.delegate = selfsession.activate()}}func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {print("iOS: WCSession activationDidComplete: \(activationState) error: \(String(describing: error))")}
    }
    
  2. watchOS 端会话初始化
    在 watchOS App 的入口点中,同样创建 WatchSessionManager 单例初始化会话。

    @main
    struct ExploreHereWatchApp: App {init() {let _ = WatchSessionManager.shared}var body: some Scene {WindowGroup {ContentView().environmentObject(HotelType.shared)}}
    }
    

    WatchSessionManager.swift

    import WatchConnectivityclass WatchSessionManager: NSObject, WCSessionDelegate, ObservableObject {static let shared = WatchSessionManager()let session = WCSession.defaultoverride init() {super.init()if WCSession.isSupported() {session.delegate = selfsession.activate()}}func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {print("watchOS: WCSession activationDidComplete: \(activationState) error: \(String(describing: error))")}func sessionReachabilityDidChange(_ session: WCSession) {print("watchOS: Reachability Changed: \(session.isReachable)")}
    }
    

通过上述步骤,iOS 和 watchOS 端的会话被激活,当两个设备连接时 session.isReachable 会为 true,表明可以双向通信。

三、数据模型与单例共享(这一步非常关键)
  1. 数据模型定义

    struct Hotels: Identifiable {var id = UUID()var name: Stringvar description: Stringvar image: Stringvar suitRoom: String?var price: Intvar nearbyAttractions: [String]var latitude: Doublevar longitude: Double
    }class HotelType: ObservableObject {static let shared = HotelType() // 单例@Published var hotelComponent: [Hotels] = []func addHotels(newItem: Hotels) {hotelComponent.append(newItem)print("HotelType: Added hotel - \(newItem.name)")}func removeHotel(item: Hotels) {if let index = hotelComponent.firstIndex(where: { $0.id == item.id }) {hotelComponent.remove(at: index)}}
    }
    

    在 iOS 与 watchOS 两端共享同一数据模型文件,以保持数据一致性与便于转换。

  2. 环境对象注入
    在 iOS 的 ExploreHereApp 中使用 .environmentObject(HotelType.shared) 以保证全局使用相同的 HotelType 实例,使得更新在任意位置发生后,UI 都能感知到变更。

四、从 watchOS 端发送数据到 iOS 端
  1. watchOS 发送数据
    当用户在 watchOS 上点击 “Register” 按钮预订酒店时,构建可序列化的字典并通过 sendMessage 发送到 iOS:

    extension WatchSessionManager {func sendHotelToiPhone(hotel: Hotels) {guard session.isReachable else {print("watchOS: iPhone不可达,数据未发送")return}var hotelData: [String: Any] = ["name": hotel.name,"description": hotel.description,"image": hotel.image,"price": hotel.price,"nearbyAttractions": hotel.nearbyAttractions,"latitude": hotel.latitude,"longitude": hotel.longitude]// 若 suitRoom 存在则添加,否则省略或使用空字符串避免 nilif let room = hotel.suitRoom {hotelData["suitRoom"] = room}session.sendMessage(["hotel": hotelData], replyHandler: nil, errorHandler: { error inprint("watchOS: 发送失败 - \(error.localizedDescription)")})}
    }
    

    在 watchOS DetailView 的注册按钮中调用:

    
    Button(action: {// 可选,本地添加到 watchOS 端的数据模型// hotelsList.addHotels(newItem: hotel)// 发送给 iOSWatchSessionManager.shared.sendHotelToiPhone(hotel: hotel)
    }) {Text("Register").foregroundColor(.white).padding().background(Color.blue).cornerRadius(15)
    }
    
  2. iOS 接收数据并更新模型
    iOSAppSessionManager 中实现 didReceiveMessage,解析收到的酒店字典并添加到 HotelType.shared

    
    extension iOSAppSessionManager {func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {print("iOS: didReceiveMessage triggered")if let hotelData = message["hotel"] as? [String:Any],let h = decodeHotel(from: hotelData) {DispatchQueue.main.async {HotelType.shared.addHotels(newItem: h)}}}private func decodeHotel(from dict: [String:Any]) -> Hotels? {guard let name = dict["name"] as? String,let description = dict["description"] as? String,let image = dict["image"] as? String,let price = dict["price"] as? Int,let nearbyAttractions = dict["nearbyAttractions"] as? [String],let latitude = dict["latitude"] as? Double,let longitude = dict["longitude"] as? Double else {return nil}let suitRoom = dict["suitRoom"] as? Stringreturn Hotels(name: name,description: description,image: image,suitRoom: suitRoom,price: price,nearbyAttractions: nearbyAttractions,latitude: latitude,longitude: longitude)}
    }
    
五、UI自动刷新与故障排查
  1. UI自动刷新
    CartView 使用 @EnvironmentObject var hotelType: HotelType,当 hotelComponent 改变时,视图会自动刷新显示最新的酒店订单。

    if hotelType.hotelComponent.count > 0 {ForEach(hotelType.hotelComponent, id: \.id) { hotel in// 显示已预订的酒店信息}
    } else {Text("No hotels booked yet!").padding()
    }
    
  2. 错误与警告处理

    • 如果出现 Payload contains unsupported type 错误,检查发送的字典中是否有 nil 或非 Property List 类型的值。例如:确保可选值处理得当。(细节)
    • 若出现 “Modifying state during view update” 警告,可确保在主线程中异步更新数据,并检查在视图刷新周期外进行数据修改。(不重要)
    • 确保 iOS App 在前台才能收到 sendMessage 消息,否则考虑使用 transferUserInfo 进行异步数据传输。(没有尝试)
六、最终效果

在完成上述工作后,流程为:

  1. 用户在 Apple Watch 的 DetailView 中点击 “Register” 按钮。
  2. watchOS 通过 WatchSessionManager 使用 sendMessage 将酒店数据字典发送给 iOS。
  3. iOS iOSAppSessionManagerdidReceiveMessage 回调触发,解析数据后更新 HotelType.shared
  4. 因为 CartView 使用了 hotelType@EnvironmentObject,数据改变会自动触发 UI 刷新,并在购物车中显示新增的酒店订单。

总结

通过 WatchConnectivity 框架和 SwiftUI 的数据驱动机制,我们成功实现了 Apple Watch 与 iOS App 之间的实时数据同步。当用户在 watchOS 上进行酒店预订时,无需手动刷新或额外交互,iOS 端的购物车界面就能自动展示最新订单信息。这为跨设备的使用体验提供了便利,也为后续拓展更多交互打下了基础。

本次实现的要点包括:

  • 使用 WCSession 在 iOS 与 watchOS 之间建立通信通道。
  • 在 watchOS 上通过 sendMessage 发送 Property List 类型的字典数据。
  • 在 iOS 上使用 didReceiveMessage 回调解析并更新数据模型。
  • 使用单例模式与 @EnvironmentObject 确保数据共享与 UI 同步。
  • 处理可选值与数据类型,确保消息传输过程中不出现不支持的类型。

这样,其他开发者可以参考本记录快速上手,将类似的数据同步功能集成到自己的 watchOS 和 iOS 应用中。

补充

  1. iOS 端成功接收到来自 watchOS 的消息,但 iOS 端的购物车界面(CartView)没有更新
问题分析
  1. 实例不一致
    • 你的 CartView 使用的是通过 @EnvironmentObject var hotelType: HotelType 注入的 hotelType 实例。
    • 而在 iOSAppSessionManager 中,你试图通过 HotelType.shared 来更新数据。
    • 如果 HotelType 没有定义 shared 静态实例,或者 shared 实例与 CartView 使用的实例不同步,CartView 自然无法感知到数据的变化。
解决方案
步骤一:确保 HotelType 使用单例模式

为了确保所有地方都在更新同一个 HotelType 实例,我们将 HotelType 修改为单例模式,并确保在 ExploreHereApp 中注入的是这个单例实例。

  1. 修改 HotelType

    import Foundation
    import SwiftUI//MARK: MODEL VIEWclass HotelType: ObservableObject {static let shared = HotelType() // 添加这一行,创建单例实例@Published var hotelComponent: [Hotels] = []func addHotels(newItem: Hotels) {hotelComponent.append(newItem)}// 新增删除方法func removeHotel(item: Hotels) {if let index = hotelComponent.firstIndex(where: { $0.id == item.id }) {hotelComponent.remove(at: index)}}
    }
    
  2. 修改 ExploreHereApp 以使用 HotelType.shared

    import SwiftUI@main
    struct ExploreHereApp: App {@StateObject private var tripType = TripType()// 移除 @StateObject private var hotelType = HotelType()init() {let _ = iOSAppSessionManager.shared // 确保 iOS 端的会话管理器被初始化}var body: some Scene {WindowGroup {ContentView().environmentObject(tripType).environmentObject(HotelType.shared) // 使用单例实例}}
    }
    
  3. 确保 iOSAppSessionManager 使用同一个 HotelType 实例

    import Foundation
    import WatchConnectivityclass iOSAppSessionManager: NSObject, WCSessionDelegate {static let shared = iOSAppSessionManager()let session = WCSession.defaultoverride init() {super.init()if WCSession.isSupported() {session.delegate = selfsession.activate()}}func session(_ session: WCSession, activationDidCompleteWith activationState: WCSessionActivationState, error: Error?) {// 会话激活后会调用此处print("iOS: WCSession activationDidComplete: \(activationState) error: \(String(describing: error))")}// 移除不可用的方法// func sessionDidBecomeInactive(_ session: WCSession) {}// func sessionDidDeactivate(_ session: WCSession) {}
    }extension iOSAppSessionManager {func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {// 当 watchOS 端发来酒店数据时处理print("iOS: didReceiveMessage triggered")if let hotelData = message["hotel"] as? [String:Any],let h = decodeHotel(from: hotelData) {DispatchQueue.main.async {HotelType.shared.addHotels(newItem: h)}}}private func decodeHotel(from dict: [String:Any]) -> Hotels? {guard let name = dict["name"] as? String,let description = dict["description"] as? String,let image = dict["image"] as? String,let price = dict["price"] as? Int,let nearbyAttractions = dict["nearbyAttractions"] as? [String],let latitude = dict["latitude"] as? Double,let longitude = dict["longitude"] as? Double else {return nil}let suitRoom = dict["suitRoom"] as? Stringreturn Hotels(name: name,description: description,image: image,suitRoom: suitRoom,price: price,nearbyAttractions: nearbyAttractions,latitude: latitude,longitude: longitude)}
    }
    
步骤二:确保 HotelType.shared 被正确注入
  1. 检查 ContentView

    确保 ContentView 使用的是通过 @EnvironmentObject 注入的 HotelType.shared 实例。

    
    import SwiftUIstruct ContentView: View {@EnvironmentObject var tripType : TripType@EnvironmentObject var hotelType : HotelType@State private var ListScreenIsShowing = false@State private var selection = 1var body: some View {VStack{TabView(selection:$selection){Homescreen().tabItem {Image(systemName: "house")Text("Home").fontWeight(.black)}.tag(3)ListScreen(ListScreenisShowing: $ListScreenIsShowing).tabItem{Image(systemName: "bed.double").resizable()Text("Hotel")}.tag(0)PlanTripView()//.environmentObject(tripType).tabItem {Image(systemName:"figure.walk").resizable()Text ("Activities")}.tag(1)CartView().tabItem{ CartButton(numberOfItems: 0)Text ("Cart")}.badge(hotelType.hotelComponent.count)}.accentColor(.blue)}}
    }struct ContentView_Previews: PreviewProvider {static var previews: some View {ContentView().environmentObject(TripType()).environmentObject(HotelType.shared) // 使用单例实例}
    }
    
  2. 确保 HotelType.shared 被正确使用

    现在,所有通过 @EnvironmentObject var hotelType: HotelType 获取的 hotelType 实例都指向 HotelType.shared,确保数据一致。

步骤三:修复警告“Modifying state during view update”

这类警告通常是由于在 SwiftUI 视图更新期间修改了 @Published 属性。虽然你已经在主线程异步更新数据,但警告仍然存在,可能是由于视图更新与数据更新的时间点冲突。

解决方法

  1. 确保数据更新在视图更新之外

    你的 iOSAppSessionManager 已经通过 DispatchQueue.main.async 来异步更新数据,这是正确的。确保没有其他地方在视图更新期间同步修改 hotelType.hotelComponent

  2. 避免在视图生命周期方法中直接修改数据

    确保你没有在视图的 body 或其他同步执行的闭包中直接修改 hotelType.hotelComponent

  3. 添加更多调试信息

    HotelType.addHotels(newItem:) 中添加打印语句,确认数据确实被添加。

    class HotelType: ObservableObject {static let shared = HotelType()@Published var hotelComponent: [Hotels] = []func addHotels(newItem: Hotels) {hotelComponent.append(newItem)print("HotelType: Added hotel - \(newItem.name)")}func removeHotel(item: Hotels) {if let index = hotelComponent.firstIndex(where: { $0.id == item.id }) {hotelComponent.remove(at: index)print("HotelType: Removed hotel - \(item.name)")}}
    }
    
  4. 确认 CartView 正在监听 hotelComponent 的变化

    确保 CartView 中的 hotelType.hotelComponent 确实被观察,并在变化时刷新视图。

步骤四:验证数据同步
  1. 重新编译并运行应用

    • 先运行 iOS App: 在 iOS 模拟器或真机上运行你的 iOS App,并确保它处于前台。
    • 然后运行 watchOS App: 在 watch 模拟器或真机上运行 watchOS App。
    • 在 watchOS App 中点击“Register”按钮: 这将发送酒店数据到 iOS App。
  2. 观察控制台日志

    • iOS 端

      • 应该看到 iOS: didReceiveMessage triggered
      • 应该看到 HotelType: Added hotel - [酒店名称]
    • watchOS 端

      • 应该看到 watchOS: WCSession activationDidComplete: activated ...
      • 应该看到 watchOS: Reachability Changed: true
      • 不应该再看到 watchOS: iPhone不可达,数据未发送
  3. 检查 CartView

    • 确认 CartView 中的酒店列表是否已更新,显示了从 watchOS 添加的新酒店。
步骤五:处理“Modifying state during view update”警告

如果警告依然存在,但数据同步功能正常,你可以暂时忽略这个警告。但为了更彻底地解决,可以尝试以下方法:

  1. 延迟数据更新:(这一步没用)

    iOSAppSessionManager 中,稍微延迟数据的添加,以避免在 SwiftUI 视图更新期间修改数据。

    DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {HotelType.shared.addHotels(newItem: h)
    }
    
  2. 检查视图层级

    确保没有其他视图在数据更新期间触发状态变化,导致数据被多次修改。

  3. 优化数据更新逻辑

    确保数据更新仅在必要时进行,避免重复或不必要的修改。

总结

通过以下步骤,你应该能够解决数据同步和警告问题:

  1. 确保 HotelType 使用单例模式,并在 ExploreHereApp 中注入 HotelType.shared
  2. 确保 iOSAppSessionManager 使用同一个 HotelType.shared 实例 来更新数据。
  3. 确认数据更新在主线程异步执行,避免在视图更新期间修改数据。
  4. 重新运行应用,确保数据同步功能正常,CartView 能够实时显示新增的酒店数据。
  5. 处理警告信息,确保 SwiftUI 视图的稳定性和数据一致性。

展示

见github
https://github.com/boots-coder/whereWeGo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/890700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux------进程处理(system库函数)

视频&#xff1a; 【尚硅谷嵌入式Linux应用层开发&#xff0c;linux网络编程&#xff0c;linux进程线程&#xff0c;linux文件io】https://www.bilibili.com/video/BV1DJ4m1M77z?p34&vd_source342079de7c07f82982956aad8662b467 #include <stdlib.h> #include <…

【数据库原理】数据增删改查,DML、单表查询、多表连接查询

DML数据操纵语言&#xff0c;处理对象是数据本身。 DDL数据定义语言&#xff0c;处理对象是数据表的结构。 数据库中数据处理主要包括增删改查。查询属于重点部分。 假设数据库中有表&#xff1a; student(sno,sname,sex,class); #学生&#xff08;学号&#xff0c;姓名&…

JAVA HTTP压缩数据

/*** 压缩数据包** param code* param data* param resp* throws IOException*/protected void writeZipResult(int code, Object data, HttpServletResponse resp) throws IOException {resp.setHeader("Content-Encoding", "gzip");// write到客户端resp…

UDP传输层通信协议详解

引言 在计算机网络通信的广阔天地中&#xff0c;传输层协议扮演着至关重要的角色。它们负责在网络中的两个终端之间建立、管理和终止数据传输。在众多传输层协议中&#xff0c;UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;以其独特的特性和应…

计算机组成原理的学习笔记(4)--数据的表示与运算·其三 补码的乘法以及原码补码的除法

学习笔记 前言 本文主要是对于b站尚硅谷的计算机组成原理的学习笔记&#xff0c;仅用于学习交流。 1.补码乘法 基本操作 与正常原码乘法差不多&#xff0c;逐位乘&#xff0c;随后相加&#xff0c;而与符号位有关的一项也叫校正项 Booth算法 从乘数的最低位开始&#xff0c…

【人工智能】使用Python构建推荐系统:从协同过滤到深度学习

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 推荐系统是现代互联网的重要组成部分,广泛应用于电商、社交媒体和流媒体平台中。本文详细介绍了如何使用Python构建推荐系统,从传统的协同…

K8s证书过期

part of the existing bootstrap client certificate is expired: 2023-11-27 12:44:12 0000 UTC 查看运行日志&#xff1a; journalctl -xefu kubelet 重新生成证书&#xff1a; #重新生成证书 kubeadm alpha certs renew all #备份旧的配置文件 mv /etc/kubernetes/*.conf…

Llama 3 模型系列解析(一)

目录 1. 引言 1.1 Llama 3 的简介 1.2 性能评估 1.3 开源计划 1.4 多模态扩展 ps 1. 缩放法则 2. 超额训练&#xff08;Over-training&#xff09; 3. 计算训练预算 4. 如何逐步估算和确定最优模型&#xff1f; 2. 概述 2.1 Llama 3 语言模型开发两个主要阶段 2.2…

BenchmarkSQL使用教程

1. TPC-C介绍 Transaction Processing Performance Council (TPC) 事务处理性能委员会&#xff0c;是一家非盈利IT组织&#xff0c;他们的目的是定义数据库基准并且向产业界推广可验证的数据库性能测试。而TPC-C最后一个C代表的是压测模型的版本&#xff0c;在这之前还有TPC-A、…

[react 3种方法] 获取ant组件ref用ts如何定义?

获取ant的轮播图组件, 我用ts如何定义? Strongly Type useRef with ElementRef | Total TypeScript import React, { ElementRef } from react; const lunboRef useRef<ElementRef<typeof Carousel>>(null); <Carousel autoplay ref{lunboRef}> 这样就…

【ES6复习笔记】let 和 const 命令(1)

ES6 中的 let 和 const 关键字 1. let 关键字 let 关键字用于声明一个变量&#xff0c;它具有块级作用域&#xff0c;这意味着变量只在声明它的块内有效。与 var 不同&#xff0c;let 不允许在同一作用域内重复声明同一个变量。 2. const 关键字 const 关键字用于声明一个常…

mysql,数据库主从同步搭建

1.mysql主从同步1.主从同步原理(1)复现binlog日志中的sql语句(2)主服务器启动binlog日志(3)从服务器启动binlog日志,io线程,sql线程2.主从同步结构一主一从一主多从级联复制互为主从(keepalived高可用)3.mysql复制模式异步复制:主服务器处理完sql直接返回给客户端结果半同步复制…

从Condition开始,回顾AQS

Synchronized和Reentrantlock的挂起逻辑 synchronized中有两个核心的结构 EntryList cxq&#xff1a;等待拿锁的线程存储位置Waitset&#xff1a;被执行wait方法的线程存储位置 流转&#xff1a; 线程获取锁资源失败&#xff0c;扔到EntryList cxq线程持有锁资源&#x…

预览和下载 (pc和微信小程序)

1.微信小程序 预览pdf 或者 图片等 //utils.js 文件//通过接口返回文件链接 打开文档 export default function previewFile({ downLinkUrl, tempFilePath }) {let url "https://" downLinkUrl.replace("http://", "").replace("https:…

用例图和活动图的区别与联系

在软件开发过程中&#xff0c;需求分析是至关重要的一步。为了更好地理解和描述系统的功能需求&#xff0c;开发人员通常会使用各种图形化工具。其中&#xff0c;用例图和活动图是两种非常常用的工具。虽然它们都用于描述系统的行为&#xff0c;但各自具有不同的特点和适用场景…

PCL-计算点云AABB包围盒

PCL-计算点云AABB包围盒 一、概述二、实验代码三、效果展示四、总结 一、概述 点云包围盒也叫外接最小矩形,是一种求解离散点集最优包围空间的算法&#xff0c;基本思想是用体积稍大且特性简单的几何体&#xff08;称为包围盒&#xff09;来近似地代替复杂的几何对象。常见的包…

Linux复习3——管理文件系统2

修改文件权限命令 chmod 功能&#xff1a; chmod 命令主要用于修改文件或者目录的权限 只有文件所有者和超级用户可以修改文件或目录的权限 (1)使用数字表示法修改权限 所谓数字表示法是指将读取(r)、写入(w)和执行(x)分别以4、2、1来表示&#xff0c;没有授予的部分就表示…

单片机:实现可调时钟(附带源码)

单片机实现可调时钟设计 在许多嵌入式系统中&#xff0c;时钟功能是非常重要的&#xff0c;尤其是在需要实时显示或调节时间的应用中。例如&#xff0c;我们可以设计一个可调时钟&#xff0c;用户可以通过按键或者外部信号调节时钟的时间&#xff08;例如调节时、分、秒&#…

微机接口课设——基于Proteus和8086的打地鼠设计(8255、8253、8259)

原理图设计 汇编代码 ; I/O 端口地址定义 IOY0 EQU 0600H IOY1 EQU 0640H IOY2 EQU 0680HMY8255_A EQU IOY000H*2 ; 8255 A 口端口地址 MY8255_B EQU IOY001H*2 ; 8255 B 口端口地址 MY8255_C EQU IOY002H*2 ; 8255 C 口端口地址 MY8255_MODE EQU IOY003H*2 ; …

代码随想录day25 | leetcode 491.递增子序列 46.全排列 回溯总结

考试周连考不复习就挂科了 一直没更新十分抱歉 今天开始在周日前补回来 491.递增子序列 在90.子集I中我们是通过排序&#xff0c;再加一个标记数组来达到去重的目的。 而本题求自增子序列&#xff0c;是不能对原数组进行排序的&#xff0c;排完序的数组都是自增子序列了。 …