如何计算所有 类 被调用了多少次
How to count how many times all classes are called
我希望用户能够知道他们访问了每个 class 的次数。然后将每页的总数加在一起形成一个组总和。我想在两个视图控制器中的每一个的日志文件中打印总和。所以应该只打印一个字符串。
class oneV: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
UserDefaults.standard.set(true, forKey: "VC1")
}
}
class twoV: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
UserDefaults.standard.set(true, forKey: "VC2")
}
}
根据您的要求,对应用程序使用情况进行分析。您可以通过两种方式实施
- 通过将屏幕访问数据存储在本地数据库中,并在分析页面或摘要页面上显示。
在数据库中存储屏幕详细信息的示例代码:
==> 创建用于屏幕捕获的实体。
ScreenVisit.
==> 用屏幕名称存储数据。
let entity = NSEntityDescription.entity(forEntityName: "ScreenVisit", in: context)
let newVisit = NSManagedObject(entity: entity!, insertInto: context)
newVisit.setValue("HomeScreen", forKey: "screenname")
newVisit.setValue("1", forKey: "visited")
do {
try context.save()
} catch {
print("Failed saving")
}
==> 在您需要的地方获取数据。
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "ScreenVisit")
//request.predicate = NSPredicate(format: <Your Filter Logic>)
request.returnsObjectsAsFaults = false
do {
let result = try context.fetch(request)
for data in result as! [NSManagedObject] {
print(data.value(forKey: "screenname") as! String)
print(data.value(forKey: "visited") as! String)
}
} catch {
print("Failed")
}
- 您可以使用任何第 3 方库,例如 Google analytics、Crashlytics 来跟踪您的用户操作。
参考链接:
但根据我的经验,第二种方式更方便、更强大。
一切都取决于您的要求。
希望这能帮助您捕获用户操作。
如果你的意思是访问每个视图控制器,当你说访问每个时 class。那我建议你这样做 viewDidAppear
.
class YourViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let key = String(describing: type(of: self))
let count = UserDefaults.standard.value(forKey: key) as? Int ?? 0
UserDefaults.standard.set(value + 1, forKey: key)
}
}
为简化起见,您可以在 UIViewController
上使用扩展程序。
extension UIViewController {
func updateVisitCount() {
let key = String(describing: type(of: self))
let count = UserDefaults.standard.value(forKey: key) as? Int ?? 0
UserDefaults.standard.set(count + 1, forKey: key)
}
}
或者,如果您创建的每个视图控制器都需要这个,那么您可以创建一个基础视图控制器,您可以在任何地方使用它而不是 UIViewController
。
class BaseViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
updateVisitCount()
}
}
创建一个静态变量。静态变量是 class 的一种类型,而不是对象,因此在所有对象中都可能维护一个变量。我认为这个例子可以更好地解释这是如何工作的。点击
在 ViewDidLoad 方法中调用此函数:
func updateVisitingCounter() {
var counter = UserDefaults.standard.integer(forKey: "firstPageCounter")
counter += 1
UserDefaults.standard.set(counter, forKey: "firstPageCounter")
}
最自动的解决方案是在 viewDidLoad
中注入会计调用而不替换 原始的 viewDidLoad
.
为了演示目的,我创建了一个示例 Playground
import UIKit
import PlaygroundSupport
extension UIViewController {
@objc dynamic func substitutedViewDidAppear() {
print("This is injected code in view did appear")
substitutedViewDidAppear() // it may look like recursive, but it isn't, actually it calls the original `viewDidAppear` method.
}
class func swizzle() {
let originalMethod = class_getInstanceMethod(UIViewController.self, #selector(viewDidAppear(_:)))
let substitutedMethod = class_getInstanceMethod(UIViewController.self, #selector(substitutedViewDidAppear))
if let originalMethod = originalMethod,
let substitutedMethod = substitutedMethod {
print("swizzled")
method_exchangeImplementations(originalMethod, substitutedMethod)
} else {
print("not swizzled")
}
}
}
class MyViewController : UIViewController {
override func loadView() {
let view = UIView()
view.backgroundColor = .white
let label = UILabel()
label.frame = CGRect(x: 150, y: 200, width: 200, height: 20)
label.text = "Hello World!"
label.textColor = .black
view.addSubview(label)
self.view = view
print("view loaded")
}
}
// Swizzle
UIViewController.swizzle() // call this in @top of didFinishLaunchingWithOptions
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()
输出:
swizzled
view loaded
This is injected code in view did appear
现在在 substitutedViewDidAppear
上部按照@Rakesha Shastri 建议注入您的计数代码,调用 substitutedViewDidAppear
内的 updateVisitCount
方法并将 UIViewController.swizzle()
放入 applicationDidFinishLaunchingWithOptions
在创建根 window.
之前
您可以在项目范围内设置声明变量"outside of classes"
var vc1Count = 0
class oneV: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
vc1Count = vc1Count+1
}
}
var vc2Count = 0
class twoV: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
vc2Count = vc2Count+1
}
}
你也可以在一个共同的地方声明这些变量。
我希望用户能够知道他们访问了每个 class 的次数。然后将每页的总数加在一起形成一个组总和。我想在两个视图控制器中的每一个的日志文件中打印总和。所以应该只打印一个字符串。
class oneV: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
UserDefaults.standard.set(true, forKey: "VC1")
}
}
class twoV: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
UserDefaults.standard.set(true, forKey: "VC2")
}
}
根据您的要求,对应用程序使用情况进行分析。您可以通过两种方式实施
- 通过将屏幕访问数据存储在本地数据库中,并在分析页面或摘要页面上显示。
在数据库中存储屏幕详细信息的示例代码:
==> 创建用于屏幕捕获的实体。 ScreenVisit.
==> 用屏幕名称存储数据。
let entity = NSEntityDescription.entity(forEntityName: "ScreenVisit", in: context)
let newVisit = NSManagedObject(entity: entity!, insertInto: context)
newVisit.setValue("HomeScreen", forKey: "screenname")
newVisit.setValue("1", forKey: "visited")
do {
try context.save()
} catch {
print("Failed saving")
}
==> 在您需要的地方获取数据。
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "ScreenVisit")
//request.predicate = NSPredicate(format: <Your Filter Logic>)
request.returnsObjectsAsFaults = false
do {
let result = try context.fetch(request)
for data in result as! [NSManagedObject] {
print(data.value(forKey: "screenname") as! String)
print(data.value(forKey: "visited") as! String)
}
} catch {
print("Failed")
}
- 您可以使用任何第 3 方库,例如 Google analytics、Crashlytics 来跟踪您的用户操作。
参考链接:
但根据我的经验,第二种方式更方便、更强大。
一切都取决于您的要求。
希望这能帮助您捕获用户操作。
如果你的意思是访问每个视图控制器,当你说访问每个时 class。那我建议你这样做 viewDidAppear
.
class YourViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let key = String(describing: type(of: self))
let count = UserDefaults.standard.value(forKey: key) as? Int ?? 0
UserDefaults.standard.set(value + 1, forKey: key)
}
}
为简化起见,您可以在 UIViewController
上使用扩展程序。
extension UIViewController {
func updateVisitCount() {
let key = String(describing: type(of: self))
let count = UserDefaults.standard.value(forKey: key) as? Int ?? 0
UserDefaults.standard.set(count + 1, forKey: key)
}
}
或者,如果您创建的每个视图控制器都需要这个,那么您可以创建一个基础视图控制器,您可以在任何地方使用它而不是 UIViewController
。
class BaseViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
updateVisitCount()
}
}
创建一个静态变量。静态变量是 class 的一种类型,而不是对象,因此在所有对象中都可能维护一个变量。我认为这个例子可以更好地解释这是如何工作的。点击
在 ViewDidLoad 方法中调用此函数:
func updateVisitingCounter() {
var counter = UserDefaults.standard.integer(forKey: "firstPageCounter")
counter += 1
UserDefaults.standard.set(counter, forKey: "firstPageCounter")
}
最自动的解决方案是在 viewDidLoad
中注入会计调用而不替换 原始的 viewDidLoad
.
为了演示目的,我创建了一个示例 Playground
import UIKit
import PlaygroundSupport
extension UIViewController {
@objc dynamic func substitutedViewDidAppear() {
print("This is injected code in view did appear")
substitutedViewDidAppear() // it may look like recursive, but it isn't, actually it calls the original `viewDidAppear` method.
}
class func swizzle() {
let originalMethod = class_getInstanceMethod(UIViewController.self, #selector(viewDidAppear(_:)))
let substitutedMethod = class_getInstanceMethod(UIViewController.self, #selector(substitutedViewDidAppear))
if let originalMethod = originalMethod,
let substitutedMethod = substitutedMethod {
print("swizzled")
method_exchangeImplementations(originalMethod, substitutedMethod)
} else {
print("not swizzled")
}
}
}
class MyViewController : UIViewController {
override func loadView() {
let view = UIView()
view.backgroundColor = .white
let label = UILabel()
label.frame = CGRect(x: 150, y: 200, width: 200, height: 20)
label.text = "Hello World!"
label.textColor = .black
view.addSubview(label)
self.view = view
print("view loaded")
}
}
// Swizzle
UIViewController.swizzle() // call this in @top of didFinishLaunchingWithOptions
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()
输出:
swizzled
view loaded
This is injected code in view did appear
现在在 substitutedViewDidAppear
上部按照@Rakesha Shastri 建议注入您的计数代码,调用 substitutedViewDidAppear
内的 updateVisitCount
方法并将 UIViewController.swizzle()
放入 applicationDidFinishLaunchingWithOptions
在创建根 window.
您可以在项目范围内设置声明变量"outside of classes"
var vc1Count = 0
class oneV: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
vc1Count = vc1Count+1
}
}
var vc2Count = 0
class twoV: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
vc2Count = vc2Count+1
}
}
你也可以在一个共同的地方声明这些变量。