リアルタイムは、複雑なデータベース構造の作成を簡単にするORMフレームワークです。
単純なスケーラブルモデル構造
ファイル
コレクション
参照
ui、form
FireBase RealTimeデータベースは完全にサポートされており、生産に使用されています。 Clean FireBase APIを使用する場合、RealTimeはアプリをより迅速に作成するのに役立ちます。ここでは、複雑な構造を適用してデータを保存し、リアクティブな動作を使用してUIを更新します。リアルタイムは、軽量のデータトラフィック、データの怠zyな初期化、データの適切な分布を提供します。
財団DBはサポートされていますが、FDBにはネイティブの観測メカニズムがないため、いくつかの制限があります。
AppDelegate in func application(_: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など。 Lazy Propertiesを使用する場合は、クラス機能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-あらゆる価値のためにReadLyが保存されたプロパティ。
プロパティ- 任意の価値のために保存されたプロパティ。
リファレンス- データベースの値を参照します。参照の完全性を意味するものではありません。レコードが削除されない場合、または参照整合性を必要としない他の理由で使用します。
関係- データベース値に参照を保存します。
ReadOnlyFile -FireBaseストレージにファイル用にReadLyが保存されたプロパティ。
ファイル- 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 to 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
}(明示)Associatevaluesは、キーが参照であるが、値はオブジェクトである辞書です。保存値は、サイドキーオブジェクトにリンクを作成します。
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
}<== - 割り当てオペレーター。リアルタイムプロパティに(またはfrom)に値を割り当てる(または取得)するために使用できます。==== 、 !=== - 比較演算子。その値がEquatableプロトコルに適合するリアルタイムプロパティを比較するために使用できます。?? -NILコーテル操作を実行するInfixオペレーターは、リアルタイムプロパティまたはデフォルト値のラップ値を返します。<- - プレフィックス演算子。 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 )詳細については、プロジェクトの例を参照してください。
SingleSectionSectionTableViewDelegate-自動更新でUitableViewの単一セクションデータソースを提供します。 sectionedTableViewDelegate-自動更新でUitableViewのセクション付きデータソースを提供します。 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
}デバッグ引数「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ライセンスの下で利用できます。詳細については、ライセンスファイルを参照してください。