2017-03-25 8 views
0

はい、swift 3を使ってグローバル関数を呼び出すのが簡単です。私はそれを行うための多くの方法だと思います。しかし、私はそれが最も簡単な方法だと思う。あなたがそれをたくさん知っているなら、いくつかアドバイスをしてください。swift 3グローバル機能。そんなことができますか?

import Foundation 
import UIKit 
import FirebaseDatabase 

// Start observe the path value for the new one. 
func SMFirdatabaseGetSingleObserveWith(path: String, theSnap: @escaping (FIRDataSnapshot) -> Void) { 

    var isFirstLoad: Bool = true 
    FIRDatabase.database().reference().child(path).queryLimited(toLast: 1).observe(.childAdded, with: { (snap) in 
     if snap.exists() { 

      if isFirstLoad { 

       isFirstLoad = false 

      }else { 

       theSnap(snap) 
      } 

     } 
    }) 

} 

そして、その機能を使用したいとき。私はちょうどそれを以下のように呼ぶ。

class Message { 

    var messages: [Int] = [] 

    init() { 
     getNewMessageIndex() 
    } 

    func getNewMessageIndex() { 

     // Use global function here 
     SMFirdatabaseGetSingleObserveWith(path: "/Message/\("uid")") { (snap) in 
      messages.append(snap as! Int) 
     } 
    } 

} 
+1

は、あなたが本当に*これは*簡単だと思います行くだろうか? * easy *関数が複数のスレッドから同時に呼び出されると、深刻な問題に遭遇しますか? – vadian

+0

同時に複数のスレッドで呼び出されるのはなぜですか? –

+0

グローバル関数の主な目的はどこからでも呼び出すことです。標準アプリケーションは、異なる並行スレッドで実行されます。したがって、予期しない動作を避けるために、その非同期タスクのために関数がスレッドセーフであることを確認する必要があります。インスタンスを持つカプセル化されたクラスは、スレッドの安全性に関して非常に扱いやすくなります。 – vadian

答えて

0

私はMessageControllerのswiftファイルを作成し、その中にSMFirdatabaseGetSingleObserveWithを入れます。次に、メッセージfuncへのアクセスを提供する共有シングルトンとしてMessageControllerのインスタンスを作成します。

import Foundation 
import UIKit 
import FirebaseDatabase 

class MessageController { 

//MARK: - Properties 

static let shared = MessageController() 

// Start observe the path value for the new one. 
func SMFirdatabaseGetSingleObserveWith(path: String, theSnap: @escaping (FIRDataSnapshot) -> Void) { 

var isFirstLoad: Bool = true 
FIRDatabase.database().reference().child(path).queryLimited(toLast: 1).observe(.childAdded, with: { (snap) in 
    if snap.exists() { 

     if isFirstLoad { 

      isFirstLoad = false 

     }else { 

      theSnap(snap) 
     } 

    } 
}) 
} 
} 

すると、どこからでも関数を呼び出すために、あなたは

MessageController.shared.SMFirdatabaseGetSingleObserveWith(...) 
関連する問題