我有一个允许用户互相发送消息的应用程序。消息本地存储在用户手机的 SQL 库中。我有一个(所有对话的)数组(单个对话的)数组,电话实际使用它来填充标签值。此数组 [[pulledMessage]] 由应用程序的 didFinishLaunching 从 SQL 填充并且工作正常。我可以将任何新消息写入用户的 SQL 库,还可以更新该数组。我的问题是,我是否必须将 SQL 数据重新加载到应用程序 viewDidLoad 上的数组中(因为新消息将添加到对话中,但不会加载来自 SQL,因为加载是在 didFinishLaunching 中进行的)。这通常不会产生问题(因为在更新数组的同时填充 SQL 库基本上与从 SQL 加载到数组中是一样的),但是当用户“关闭”应用程序时会发生什么。我不是说硬关闭,比如终止它。我的意思是喜欢按下主页按钮并让它仍然在后台。 [[pulledMessage]] 是否持续存在以便我不需要重新运行它的填充(因此将加载放入 viewDidLoad),或者我是否需要这样做?
最佳答案
当应用程序暂停(通过点击主页按钮),并且用户重新启动它时,应用程序通常会再次进入前台状态,内存中的所有内容仍然存在。但是,在那种情况下,无论如何都不会调用 viewDidLoad,所以这并不重要。
您唯一会看到再次调用 didFinishLaunching 和 viewDidLoad 的情况是应用程序由于某种原因要终止。而且不仅仅是用户明确终止了您的应用程序。如果您的应用程序被挂起,用户启动另一个需要大量内存的应用程序以致您的应用程序被操作系统抛弃,也会发生这种情况。一旦你的应用被挂起,它可能会因为你无法控制的因素而被杀死,所以你应该优雅地处理它。但通常它不会被终止,而是会保留在内存中,这些方法不会被再次调用。
所以,最重要的是,如果您看到 didFinishLaunching 和 viewDidLoad 类方法被调用,这意味着该应用程序已完全重启,您将需要重新加载您的本例中的数据结构。
为了让您了解应用程序生命周期的运行情况,我向应用程序生命周期的关键事件添加了 os_log 语句。我使用了统一的日志记录系统(参见 WWDC 2016 Unified Logging and Activity Tracing 视频),因此我可以在不从 Xcode 运行应用程序时观察 macOS“控制台”应用程序的行为;从 Xcode 运行它可以改变应用程序的生命周期行为。然后,当我从设备(不是 Xcode)启动应用程序时,我在 macOS“控制台”应用程序中观看了这些内容。这是我看到的:
用户第一次启动应用:
debug 14:46:25.256978 -0700 MyApp com.domain.MyApp AppDelegate didFinishLaunching debug 14:46:25.258476 -0700 MyApp com.domain.MyApp ViewController viewDidLoad debug 14:46:25.258550 -0700 MyApp com.domain.MyApp ViewController viewWillAppear debug 14:46:25.261261 -0700 MyApp com.domain.MyApp ViewController viewDidAppear debug 14:46:25.300246 -0700 MyApp com.domain.MyApp AppDelegate applicationDidBecomeActive
The user presses the home button:
debug 14:46:46.996735 -0700 MyApp com.domain.MyApp AppDelegate applicationWillResignActive debug 14:46:48.032994 -0700 MyApp com.domain.MyApp AppDelegate applicationDidEnterBackground
And the user restarts the app by tapping on the icon:
debug 14:47:09.263330 -0700 MyApp com.domain.MyApp AppDelegate applicationWillEnterForeground debug 14:47:09.274849 -0700 MyApp com.domain.MyApp AppDelegate applicationDidBecomeActive
Note, it didn't call didFinishLaunching or viewDidLoad.
FYI, it's probably apparent from the above, but this is the app delegate code to generate those logging messages:
// AppDelegate.swift
import UIKit
import os.log
private let log = OSLog(subsystem: "com.domain.MyApp", category: "AppDelegate")
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
os_log("didFinishLaunching", log: log, type: .debug)
return true
}
func applicationWillResignActive(_ application: UIApplication) {
os_log("applicationWillResignActive", log: log, type: .debug)
}
func applicationDidEnterBackground(_ application: UIApplication) {
os_log("applicationDidEnterBackground", log: log, type: .debug)
}
func applicationWillEnterForeground(_ application: UIApplication) {
os_log("applicationWillEnterForeground", log: log, type: .debug)
}
func applicationDidBecomeActive(_ application: UIApplication) {
os_log("applicationDidBecomeActive", log: log, type: .debug)
}
func applicationWillTerminate(_ application: UIApplication) {
os_log("applicationWillTerminate", log: log, type: .debug)
}
}
和 View Controller 代码:
// ViewController.swift
import UIKit
import os.log
private let log = OSLog(subsystem: "com.domain.MyApp", category: "ViewController")
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
os_log("viewDidLoad", log: log, type: .debug)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
os_log("viewWillAppear", log: log, type: .debug)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
os_log("viewDidAppear", log: log, type: .debug)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
os_log("viewWillDisappear", log: log, type: .debug)
}
override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
os_log("viewDidDisappear", log: log, type: .debug)
}
}
我可能还会向您推荐 Execution States for Apps和 App Termination iOS 应用编程指南:应用生命周期部分了解更多信息。
关于ios - 如果按下主页按钮,变量是否会保留在应用程序中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46384137/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象