實時是ORM框架,使復雜數據庫結構的創建很簡單。
簡單的可擴展模型結構
文件
收藏
參考
UI,形式
Firebase實時數據庫得到了完全支持並用於生產中。如果您使用乾淨的firebase API,實時可以幫助更快地創建應用程序,以便將復雜的結構應用於存儲數據,以使用反應性行為更新UI。實時提供輕巧的數據流量,數據的懶惰初始化,數據的良好分佈。
支持FoundationDB,但有一些局限性,因為FDB沒有本地觀察機制。
在func application(_:didFinishLaunchingWithOptions:)中的AppDelegate中(_:didfinishlaunchingwithoptions :)您必須在下面調用代碼,以配置工作環境。現在,對於緩存策略是有效的值case .noCache, .persistance 。內存中的緩存尚未實現。
func application ( _ application : UIApplication , didFinishLaunchingWithOptions launchOptions : [ UIApplicationLaunchOptionsKey : Any ] ? ) -> Bool {
/// ...
/// initialize Realtime
RealtimeApp . initialize ( ... )
///...
return true
}為了創建任何模型數據結構,您可以通過子類別Object製作。您可以使用類定義兒童屬性:
Object子類;ReadonlyProperty , Property , Reference , Relation , ReadonlyFile , File ;References , Values , AssociatedValues等;如果使用懶惰屬性,則需要實現類功能lazyPropertyKeyPath(for:) 。 (請告訴我,如果您知道如何避免它,而無需繼承NSOBJECT)。此功能要求每個子類都需要,因此您不需要調用超級實現。例子: class User : Object {
lazy var name : Property < String > = " name " . property ( in : self )
lazy var age : Property < Int > = " age " . property ( in : self )
lazy var photo : File < UIImage ? > = " photo " . file ( in : self , representer : . png )
lazy var groups : References < RealtimeGroup > = " groups " . references ( in : self , elements : . groups )
lazy var scheduledConversations : Values < Conversation > = " scheduledConversations " . values ( in : self )
lazy var ownedGroup : Relation < RealtimeGroup ? > = " ownedGroup " . relation ( in : self , " manager " )
override class func lazyPropertyKeyPath ( for label : String ) -> AnyKeyPath ? {
switch label {
case " name " : return User . name
case " age " : return User . age
case " photo " : return User . photo
case " groups " : return User . groups
case " ownedGroup " : return User . ownedGroup
case " scheduledConversations " : return User . scheduledConversations
default : return nil
}
}
}
let user = User ( in : Node ( key : " user_1 " ) )
user . name <== " User name "
user . photo <== UIImage ( named : " img " )
let transaction = user . save ( in : . root )
transaction . commit ( with : { state , err in
/// process error
} )ReadOnlyProperty-任何值的ReadOnly存儲的屬性。
屬性- 存儲任何值的屬性。
參考- 在任何數據庫值上存儲參考。並不意味著參考完整性。如果不會刪除記錄,否則請使用它,或者其他不需要參考完整性的原因。
關係- 將參考存儲在任何數據庫值上。
ReadOnlyFile-在Firebase存儲中以文件為文件。
文件- 存儲的屬性用於Firebase存儲中的文件。
所有屬性都採用@propertyWrapper功能,但是儘管Swift在自定義懶惰屬性中不支持self訪問,但這種方式來定義屬性通常沒有用。
class Some : Object {
lazy var array : Values < Object > = " some_array " . values ( in : self )
lazy var references : References < Object > = " some_linked_array " . references ( in : self , elements : . linkedObjects )
lazy var dictionary : AssociatedValues < Object > = " some_dictionary " . dictionary ( in : self , keys : . keyObjects )
}收集的一些可變操作可能需要isSynced 。為了實現此狀態,請使用func runObserving()函數或設置屬性keepSynced: Bool為true 。
(分佈式)引用是存儲對像作為引用的數組。源元素必須位於相同的參考中。在將對象插入此數組時,會在側對像上創建鏈接。
(顯式)值是數組,它可以按值本身位置存儲對象。 “顯式”前綴用於存儲沒有收集視圖的元素的集合中。
References , Values突變:
do {
let transaction = Transaction ( )
...
let element = Element ( )
try array . write ( element : element , in : transaction )
try otherArray . remove ( at : 1 , in : trasaction )
transaction . commit { ( err ) in
// process error
self . tableView . reloadData ( )
}
} catch let e {
// process error
}(顯式)關聯值是字典,其中鍵是引用,但值是對象。在“保存值”上,在側鍵對像上創建鏈接。
AssociatedValues突變:
do {
let transaction = Transaction ( )
...
let element = Element ( )
try dictionary . write ( element : element , key : key , in : transaction )
try otherDictionary . remove ( by : key , in : transaction )
transaction . commit { ( err ) in
// process error
}
} catch let e {
// process error
}MapRealTimeCollection是不可變的集合,從地圖功能獲取元素。這是X.lazymap(_ transform :)方法的結果,其中x是任何realtimecollection。
let userNames = Values < User > ( in : usersNode ) . lazyMap { user in
return user . name
}<== - 分配運算符。可以用來將(或檢索)值分配給(從)任何實時屬性。==== , !=== - 比較操作員。可以用來比較其值符合Equatable協議的任何實時屬性。?? - 執行NIL煤層操作的Infix Operator,返回實時屬性的包裝值或默認值。<- - 前綴操作員。可以用於轉換Closure, Assign給顯式閉合或向後。事務- 包含有關寫入交易的所有信息的對象。幾乎所有數據更改都使用此對象執行。最可變的操作只是將交易作為參數,但是要創建自定義復雜操作,您可以使用以下方法:
/// adds operation of save RealtimeValue as single value as is
func set < T > ( _ value : T , by node : Node ) where T : RealtimeValue & RealtimeValueEvents
/// adds operation of delete RealtimeValue
func delete < T > ( _ value : T ) where T : RealtimeValue & RealtimeValueEvents
/// adds operation of update RealtimeValue
func update < T > ( _ value : T ) where T : ChangeableRealtimeValue & RealtimeValueEvents & Reverting
/// method to merge actions of other transaction
func merge ( _ other : Transaction )有關更多詳細信息,請參見示例項目。
SinglesectionTableTableViewDelegate-通過自動更新提供了UITATIOTVIEW的單部分數據源。 SectionEdTableViewDelegate-通過自動更新提供了UITATIONVIEW的截面數據源。 CollectionViewDelegate-提供帶有自動更新的UICollectionView的數據源。
delegate . register ( UITableViewCell . self ) { ( item , cell , user , ip ) in
item . bind (
user . name , { cell , name in
cell . textLabel ? . text = name
} ,
{ err in
print ( err )
}
)
}
delegate . bind ( tableView )
delegate . tableDelegate = self
// data
users . changes
. listening (
onValue : { [ weak tableView ] ( e ) in
guard let tv = tableView else { return }
switch e {
case . initial : tv . reloadData ( )
case . updated ( let deleted , let inserted , let modified , let moved ) :
tv . beginUpdates ( )
tv . insertRows ( at : inserted . map ( { IndexPath ( row : $0 , section : 0 ) } ) , with : . automatic )
tv . deleteRows ( at : deleted . map ( { IndexPath ( row : $0 , section : 0 ) } ) , with : . automatic )
tv . reloadRows ( at : modified . map ( { IndexPath ( row : $0 , section : 0 ) } ) , with : . automatic )
moved . forEach { from , to in
tv . moveRow ( at : IndexPath ( row : from , section : 0 ) , to : IndexPath ( row : to , section : 0 ) )
}
tv . endUpdates ( )
}
} ,
onError : onError
)
. add ( to : listeningCollector )可作為分離的模塊可用,並帶有Combine支持。
class User : Object {
var name : Property < String >
var age : Property < Int >
}
class FormViewController : UIViewController {
var form : Form < User >
override func viewDidLoad ( ) {
super . viewDidLoad ( )
let name = Row < TextCell , Model > . inputRow (
" input " ,
title : Localized . name ,
keyboard : . name ,
placeholder : . inputPlaceholder ( Localized . name ) ,
onText : { $0 . name <== $1 }
)
name . onUpdate { ( args , row ) in
args . view . textField . text <== args . model . name
}
let age = Row < TextCell , Model > . inputRow (
" input " ,
title : Localized . age ,
keyboard : . numberPad ,
placeholder : requiredPlaceholder ,
onText : { $0 . age <== $1 }
)
age . onUpdate { ( args , row ) in
args . view . textField . text <== args . model . age
}
let button : Row < ButtonCell , Model > = Row ( reuseIdentifier : " button " )
button . onUpdate { ( args , row ) in
args . view . titleLabel . text = Localized . login
}
button . onSelect { [ unowned self ] ( _ , row ) in
self . submit ( )
}
let fieldsSection : StaticSection < Model > = StaticSection ( headerTitle : nil , footerTitle : nil )
fieldsSection . addRow ( name )
fieldsSection . addRow ( age )
let buttonSection : StaticSection < Model > = StaticSection ( headerTitle : nil , footerTitle : nil )
buttonSection . addRow ( button )
form = Form ( model : User ( ) , sections : [ fieldsSection , buttonSection ] )
form . tableView = tableView
form . tableDelegate = self
}
}要接收本地級別的更改,請使用符合此協議的對象。它具有類似的RXSWIFT接口。
public protocol Listenable {
associatedtype OutData
/// Disposable listening of value
func listening ( _ assign : Assign < OutData > ) -> Disposable
}添加debug參數“ REALTIME_CRASH_ON_ERROR”在啟動時傳遞,以捕獲內部錯誤。
也存在為vue.js應用程序創建的nodejs模塊。您可以在js文件夾中找到源代碼。
實時對像不應在線程之間傳遞。
要運行示例項目,請首先從示例目錄中pod install 。
Xcode 9+,Swift 4.1+。
SwiftPM
. package ( url : " https://github.com/k-o-d-e-n/realtime.git " , . branch ( " master " ) )實時可通過Cocoapods獲得。要安裝它,只需將以下行添加到您的podfile:
pod 'Realtime' pod 'RealtimeForm/Combine' , :git => 'https://github.com/k-o-d-e-n/Realtime.git' , :branch => 'master' koryttsev denis,[email protected]
Twitter:@k_o_d_e_n
實時可根據MIT許可證獲得。有關更多信息,請參見許可證文件。