Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
囧jt
DoraemonKit
提交
cda96d46
D
DoraemonKit
项目概览
囧jt
/
DoraemonKit
通知
129
Star
3
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
75
列表
看板
标记
里程碑
合并请求
2
DevOps
流水线
流水线任务
计划
Wiki
1
Wiki
分析
仓库
DevOps
项目成员
Pages
D
DoraemonKit
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
75
Issue
75
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
1
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
cda96d46
编写于
7月 03, 2020
作者:
0
0xd-cc
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat: 内存检测
上级
a421a77a
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
352 addition
and
1 deletion
+352
-1
iOS/DoraemonKitDemo/Podfile.lock
iOS/DoraemonKitDemo/Podfile.lock
+1
-1
iOS/Swift/DoKitSwift/Src/DoKit.swift
iOS/Swift/DoKitSwift/Src/DoKit.swift
+1
-0
iOS/Swift/DoKitSwift/Src/Plugins/Performance/Memory/MemoryCalculator.swift
...ift/Src/Plugins/Performance/Memory/MemoryCalculator.swift
+30
-0
iOS/Swift/DoKitSwift/Src/Plugins/Performance/Memory/MemoryPlugin.swift
...itSwift/Src/Plugins/Performance/Memory/MemoryPlugin.swift
+21
-0
iOS/Swift/DoKitSwift/Src/Plugins/Performance/Memory/MemoryViewController.swift
...Src/Plugins/Performance/Memory/MemoryViewController.swift
+72
-0
iOS/Swift/DoKitSwift/Src/Plugins/UI/Oscillogram/OscillogramView.swift
...KitSwift/Src/Plugins/UI/Oscillogram/OscillogramView.swift
+138
-0
iOS/Swift/DoKitSwift/Src/Plugins/UI/Oscillogram/OscillogramWindow.swift
...tSwift/Src/Plugins/UI/Oscillogram/OscillogramWindow.swift
+37
-0
iOS/Swift/DoKitSwift/Src/Plugins/UI/Oscillogram/OscillogramWindowManager.swift
...Src/Plugins/UI/Oscillogram/OscillogramWindowManager.swift
+52
-0
未找到文件。
iOS/DoraemonKitDemo/Podfile.lock
浏览文件 @
cda96d46
...
...
@@ -122,7 +122,7 @@ SPEC CHECKSUMS:
FBRetainCycleDetector: 46daef95c2dfa9be34b53087edf6a8f34e4c749c
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
GCDWebServer: c0ab22c73e1b84f358d1e2f74bf6afd1c60829f2
libwebp:
04242ef451672185c1fe41b285a034d2fbda483c
libwebp:
946cb3063cea9236285f7e9a8505d806d30e07f3
SDWebImage: 920f1a2ff1ca8296ad34f6e0510a1ef1d70ac965
SDWebImageWebPCoder: ce58a29621c2806dd5c36695ed192cf67163ff9d
SocketRocket: d57c7159b83c3c6655745cd15302aa24b6bae531
...
...
iOS/Swift/DoKitSwift/Src/DoKit.swift
浏览文件 @
cda96d46
...
...
@@ -43,6 +43,7 @@ public class DoKit {
addPlugin
(
plugin
:
LogPlugin
())
addPlugin
(
plugin
:
ANRPlugin
())
addPlugin
(
plugin
:
MemoryPlugin
())
setup
()
}
...
...
iOS/Swift/DoKitSwift/Src/Plugins/Performance/Memory/MemoryCalculator.swift
0 → 100644
浏览文件 @
cda96d46
//
// MemoryCalculator.swift
// DoraemonKit-Swift
//
// Created by hash0xd on 2020/6/24.
//
import
Foundation
struct
MemoryCalculator
{
static
func
memoryUsage
()
->
Double
{
var
taskInfo
=
task_vm_info_data_t
()
var
count
=
mach_msg_type_number_t
(
MemoryLayout
<
task_vm_info
>.
size
)
/
4
let
result
:
kern_return_t
=
withUnsafeMutablePointer
(
to
:
&
taskInfo
)
{
$0
.
withMemoryRebound
(
to
:
integer_t
.
self
,
capacity
:
1
)
{
task_info
(
mach_task_self_
,
task_flavor_t
(
TASK_VM_INFO
),
$0
,
&
count
)
}
}
var
used
:
UInt64
=
0
if
result
==
KERN_SUCCESS
{
used
=
UInt64
(
taskInfo
.
phys_footprint
)
}
return
Double
(
used
)
/
1024
/
1024
}
static
var
total
:
Double
{
return
Double
(
ProcessInfo
.
processInfo
.
physicalMemory
)
/
1024
/
1024
}
}
iOS/Swift/DoKitSwift/Src/Plugins/Performance/Memory/MemoryPlugin.swift
0 → 100644
浏览文件 @
cda96d46
//
// MemoryPlugin.swift
// DoraemonKit-Swift
//
// Created by hash0xd on 2020/6/24.
//
import
Foundation
struct
MemoryPlugin
:
Plugin
{
static
var
isOn
=
false
var
module
:
PluginModule
{
.
performance
}
var
title
:
String
{
"Memory"
}
var
icon
:
UIImage
?
{
DKImage
(
named
:
"doraemon_kadun"
)
}
func
onInstall
()
{
/* do nothing */
}
func
onSelected
()
{
HomeWindow
.
shared
.
openPlugin
(
vc
:
MemoryViewController
())
}
}
iOS/Swift/DoKitSwift/Src/Plugins/Performance/Memory/MemoryViewController.swift
0 → 100644
浏览文件 @
cda96d46
//
// MemoryViewController.swift
// DoraemonKit-Swift
//
// Created by hash0xd on 2020/6/24.
//
import
UIKit
class
MemoryViewController
:
BaseViewController
{
static
let
oscillogramView
=
OscillogramView
()
private
let
switchView
=
CellSwitch
(
frame
:
.
zero
)
override
func
viewDidLoad
()
{
super
.
viewDidLoad
()
setupUI
()
}
private
func
setupUI
()
{
set
(
title
:
LocalizedString
(
"内存检测"
))
switchView
.
translatesAutoresizingMaskIntoConstraints
=
false
view
.
addSubview
(
switchView
)
if
#available(iOS 11.0, *)
{
switchView
.
topAnchor
.
constraint
(
equalTo
:
view
.
safeAreaLayoutGuide
.
topAnchor
)
.
isActive
=
true
}
else
{
switchView
.
topAnchor
.
constraint
(
equalTo
:
view
.
topAnchor
)
.
isActive
=
true
}
let
switchViewConstraints
=
[
switchView
.
leadingAnchor
.
constraint
(
equalTo
:
view
.
leadingAnchor
),
switchView
.
trailingAnchor
.
constraint
(
equalTo
:
view
.
trailingAnchor
),
switchView
.
heightAnchor
.
constraint
(
equalToConstant
:
CellSwitch
.
defaultHeight
)
]
NSLayoutConstraint
.
activate
(
switchViewConstraints
)
switchView
.
renderUIWithTitle
(
title
:
LocalizedString
(
"内存检测开关"
),
on
:
MemoryPlugin
.
isOn
)
switchView
.
needTopLine
()
switchView
.
needDownLine
()
switchView
.
delegate
=
self
}
}
extension
MemoryViewController
:
CellSwitchDelegate
{
func
changeSwitchOn
(
on
:
Bool
)
{
MemoryPlugin
.
isOn
=
on
if
on
{
OscillogramWindowManager
.
shared
.
add
(
oscillogramView
:
MemoryViewController
.
oscillogramView
)
MemoryViewController
.
oscillogramView
.
delegate
=
self
}
else
{
OscillogramWindowManager
.
shared
.
remove
(
oscillogramView
:
MemoryViewController
.
oscillogramView
)
}
}
}
extension
MemoryViewController
:
OscillogramViewDelegate
{
var
oscillogramMaxValue
:
Double
{
return
MemoryCalculator
.
total
}
func
collectData
()
->
Double
{
MemoryCalculator
.
memoryUsage
()
}
func
oscillogramViewDidColsed
()
{
MemoryPlugin
.
isOn
=
false
OscillogramWindowManager
.
shared
.
remove
(
oscillogramView
:
MemoryViewController
.
oscillogramView
)
switchView
.
renderUIWithTitle
(
title
:
LocalizedString
(
"内存检测开关"
),
on
:
MemoryPlugin
.
isOn
)
}
}
iOS/Swift/DoKitSwift/Src/Plugins/UI/Oscillogram/OscillogramView.swift
0 → 100644
浏览文件 @
cda96d46
//
// OscillogramView.swift
// DoraemonKit-Swift
//
// Created by hash0xd on 2020/6/30.
//
import
UIKit
class
OscillogramView
:
UIView
{
weak
var
delegate
:
OscillogramViewDelegate
?
private
var
timer
:
DispatchSourceTimer
?
private
var
maxValue
:
Double
{
return
delegate
?
.
oscillogramMaxValue
??
100
}
private
lazy
var
closeButton
:
UIButton
=
{
let
button
=
UIButton
(
type
:
.
custom
)
button
.
setImage
(
DKImage
(
named
:
"doraemon_close_white"
),
for
:
.
normal
)
button
.
addTarget
(
self
,
action
:
#selector(
stop
)
,
for
:
.
touchUpInside
)
return
button
}()
private
lazy
var
tipLabel
:
UILabel
=
{
let
label
=
UILabel
()
label
.
textColor
=
UIColor
(
0x00DFDD
)
label
.
font
=
UIFont
.
systemFont
(
ofSize
:
kSizeFrom750_Landscape
(
20
))
label
.
textAlignment
=
.
center
label
.
frame
=
CGRect
(
x
:
0
,
y
:
self
.
frame
.
height
,
width
:
100
,
height
:
10
)
return
label
}()
private
var
nodes
:
[
Double
]
=
[]
override
init
(
frame
:
CGRect
)
{
super
.
init
(
frame
:
frame
)
clearsContextBeforeDrawing
=
true
backgroundColor
=
UIColor
(
0x000000
,
alphaValue
:
0.33
)
let
closeButtonWidth
:
CGFloat
=
kSizeFrom750_Landscape
(
80
)
addSubview
(
closeButton
)
addSubview
(
tipLabel
)
closeButton
.
translatesAutoresizingMaskIntoConstraints
=
false
NSLayoutConstraint
.
activate
([
closeButton
.
rightAnchor
.
constraint
(
equalTo
:
rightAnchor
),
closeButton
.
topAnchor
.
constraint
(
equalTo
:
topAnchor
),
closeButton
.
widthAnchor
.
constraint
(
equalToConstant
:
closeButtonWidth
),
closeButton
.
heightAnchor
.
constraint
(
equalToConstant
:
closeButtonWidth
)
])
}
func
start
()
{
timer
?
.
cancel
()
timer
=
DispatchSource
.
makeTimerSource
()
timer
?
.
schedule
(
deadline
:
.
now
(),
repeating
:
.
seconds
(
1
),
leeway
:
.
seconds
(
0
))
timer
?
.
setEventHandler
{
[
weak
self
]
in
DispatchQueue
.
main
.
async
{
guard
let
self
=
self
else
{
return
}
if
let
value
=
self
.
delegate
?
.
collectData
()
{
self
.
nodes
.
append
(
value
)
self
.
setNeedsDisplay
()
}
}
}
timer
?
.
resume
()
}
required
init
?(
coder
:
NSCoder
)
{
fatalError
(
"init(coder:) has not been implemented"
)
}
override
func
draw
(
_
rect
:
CGRect
)
{
if
points
()
.
isEmpty
{
return
}
let
path
=
UIBezierPath
()
path
.
lineWidth
=
1
var
p
=
points
()
let
startPoint
=
p
.
removeFirst
()
path
.
move
(
to
:
startPoint
)
UIColor
(
0x00DFDD
)
.
set
()
p
.
forEach
{
(
point
)
in
path
.
addLine
(
to
:
point
)
path
.
addArc
(
withCenter
:
point
,
radius
:
1
,
startAngle
:
0
,
endAngle
:
CGFloat
.
pi
*
2
,
clockwise
:
true
)
}
path
.
stroke
()
tipLabel
.
text
=
String
(
format
:
"%.2f"
,
p
.
last
?
.
y
??
0
)
tipLabel
.
center
=
CGPoint
(
x
:
p
.
last
?
.
x
??
0
,
y
:
(
p
.
last
?
.
y
??
0
)
-
tipLabel
.
height
)
tipLabel
.
sizeToFit
()
}
private
func
points
()
->
[
CGPoint
]
{
let
padding
=
UIEdgeInsets
(
top
:
5
,
left
:
5
,
bottom
:
5
,
right
:
5
)
let
spacing
:
CGFloat
=
10
let
lineChartWidth
=
kScreenWidth
-
padding
.
left
-
padding
.
right
let
lineChartHeight
=
bounds
.
size
.
height
-
padding
.
top
-
padding
.
bottom
let
count
=
Int
(
floor
(
lineChartWidth
/
spacing
))
let
array
=
Array
(
nodes
.
suffix
(
count
))
var
points
=
[
CGPoint
]()
var
x
:
CGFloat
=
padding
.
left
array
.
forEach
{
(
value
)
in
let
y
=
lineChartHeight
*
CGFloat
(
1
-
Double
(
value
)
/
maxValue
)
+
padding
.
bottom
points
.
append
(
CGPoint
(
x
:
x
,
y
:
y
))
x
+=
spacing
}
return
points
}
@objc
func
stop
()
{
timer
?
.
cancel
()
timer
=
nil
nodes
=
[]
delegate
?
.
oscillogramViewDidColsed
()
}
override
func
hitTest
(
_
point
:
CGPoint
,
with
event
:
UIEvent
?)
->
UIView
?
{
guard
isUserInteractionEnabled
else
{
return
nil
}
guard
!
isHidden
else
{
return
nil
}
guard
alpha
>=
0.01
else
{
return
nil
}
guard
self
.
point
(
inside
:
point
,
with
:
event
)
else
{
return
nil
}
for
subview
in
subviews
.
reversed
()
{
let
convertedPoint
=
subview
.
convert
(
point
,
from
:
self
)
if
let
candidate
=
subview
.
hitTest
(
convertedPoint
,
with
:
event
)
,
candidate
is
UIButton
{
return
candidate
}
}
return
nil
}
}
protocol
OscillogramViewDelegate
:
class
{
var
oscillogramMaxValue
:
Double
{
get
}
func
collectData
()
->
Double
func
oscillogramViewDidColsed
()
}
iOS/Swift/DoKitSwift/Src/Plugins/UI/Oscillogram/OscillogramWindow.swift
0 → 100644
浏览文件 @
cda96d46
//
// OscillogramWindow.swift
// DoraemonKit-Swift
//
// Created by hash0xd on 2020/6/24.
//
import
UIKit
class
OscillogramWindow
:
UIWindow
{
override
init
(
frame
:
CGRect
)
{
super
.
init
(
frame
:
frame
)
windowLevel
=
.
statusBar
+
2
}
required
init
?(
coder
:
NSCoder
)
{
fatalError
(
"init(coder:) has not been implemented"
)
}
override
func
point
(
inside
point
:
CGPoint
,
with
event
:
UIEvent
?)
->
Bool
{
return
handle
(
point
:
point
,
event
:
event
)
}
private
func
handle
(
point
:
CGPoint
,
event
:
UIEvent
?)
->
Bool
{
let
b
=
subviews
.
reversed
()
.
map
({
recursion
(
subView
:
$0
,
point
:
point
,
event
:
event
)})
return
b
.
first
(
where
:
{
$0
})
??
false
}
private
func
recursion
(
subView
:
UIView
,
point
:
CGPoint
,
event
:
UIEvent
?)
->
Bool
{
let
convertedPoint
=
subView
.
convert
(
point
,
from
:
self
)
if
let
candidate
=
subView
.
hitTest
(
convertedPoint
,
with
:
event
),
candidate
is
UIButton
{
return
true
}
return
false
}
}
iOS/Swift/DoKitSwift/Src/Plugins/UI/Oscillogram/OscillogramWindowManager.swift
0 → 100644
浏览文件 @
cda96d46
//
// OscillogramWindowManager.swift
// DoraemonKit-Swift
//
// Created by hash0xd on 2020/6/30.
//
import
Foundation
class
OscillogramWindowManager
{
static
let
shared
=
OscillogramWindowManager
()
private
lazy
var
stackView
:
UIStackView
=
{
let
statckView
=
UIStackView
()
statckView
.
alignment
=
.
fill
statckView
.
axis
=
.
vertical
statckView
.
distribution
=
.
equalSpacing
statckView
.
spacing
=
10
return
statckView
}()
private
let
window
=
OscillogramWindow
(
frame
:
CGRect
(
x
:
0
,
y
:
0
,
width
:
kScreenWidth
,
height
:
kScreenHeight
))
private
init
()
{
window
.
addSubview
(
stackView
)
stackView
.
translatesAutoresizingMaskIntoConstraints
=
false
NSLayoutConstraint
.
activate
([
stackView
.
topAnchor
.
constraint
(
equalTo
:
window
.
topAnchor
,
constant
:
100
),
stackView
.
leadingAnchor
.
constraint
(
equalTo
:
window
.
leadingAnchor
),
stackView
.
trailingAnchor
.
constraint
(
equalTo
:
window
.
trailingAnchor
),
])
}
func
add
(
oscillogramView
:
OscillogramView
)
{
guard
!
stackView
.
arrangedSubviews
.
contains
(
window
)
else
{
return
}
defer
{
window
.
isHidden
=
stackView
.
arrangedSubviews
.
isEmpty
}
oscillogramView
.
heightAnchor
.
constraint
(
equalToConstant
:
kSizeFrom750_Landscape
(
240
))
.
isActive
=
true
stackView
.
addArrangedSubview
(
oscillogramView
)
oscillogramView
.
start
()
}
func
remove
(
oscillogramView
:
OscillogramView
)
{
defer
{
window
.
isHidden
=
stackView
.
arrangedSubviews
.
isEmpty
}
stackView
.
removeArrangedSubview
(
oscillogramView
)
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录