1

これが私の状況であり、おそらくこれを行う簡単な方法があります:

通知を使用するものをいくつかテストしていますが、期待をクラスレベルのオプション変数として定義する必要がなかったので、通知ハンドラーがアクセスできるようにそれらを関数のローカル変数にできるかどうか疑問に思っていました彼ら。

私の試みは、トップレベルのテスト関数内のネストされた関数として通知ハンドラー関数を作成することでした-しかし、通知ハンドラーに何を呼び出すように指示する必要があるかわからないため、セレクターの命名の問題に遭遇しました

class FilePlayerTests: XCTestCase {

func testFilePlayback() {


    let f1URL : NSURL = NSBundle(forClass: FilePlayerTests.self).URLForResource("test1", withExtension: "csv")!
    let f2URL : NSURL = NSBundle(forClass: FilePlayerTests.self).URLForResource("test2", withExtension: "csv")!
    let f3URL : NSURL = NSBundle(forClass: FilePlayerTests.self).URLForResource("test3", withExtension: "csv")!

    let f1 = dm.createFilePlayerFromURL(f1URL)
    let f2 = dm.createFilePlayerFromURL(f2URL)
    let f3 = dm.createFilePlayerFromURL(f3URL)


    let e1 = expectationWithDescription("xplane1")
    let e2 = expectationWithDescription("xplane2")
    let e3 = expectationWithDescription("xplane3")



    f1?.startPlayback()


    //Define LocationMessage Observer
    nc.addObserver(self, selector: "newHandler:",
        name: dmNotification.LocationData.rawValue,
        object: nil)


    ///Prints out a new Location Message
    func newHandler(notif: NSNotification) {
        let msg = notif.asLocationMessage!
        println(msg)

        e1.fulfill()
    }

}
}

セレクターが見つからないため、コードがクラッシュしています。

1) これは有効ですか?

2) セレクターを見つけられるように、セレクターに正しく名前を付けるにはどうすればよいですか?

4

1 に答える 1

1

問題は、あなたがこれを言っていることです:

nc.addObserver(self, selector: "newHandler:" ...

ただしself、 FilePlayerTests クラスにはセレクターが呼び出されていません。newHandler:これは、その関数を関数内のローカル関数としてのみ定義したためですtestFilePlayback。これはローカルにのみ存在し、testFilePlayback関数内でその後に実行されるコードから見てのみ、非常に一時的testFilePlayback(実行中) にのみ存在します。

通知センターが実際に呼び出すことができるメソッドnewHandler:になるように、FilePlayerTests クラスのトップ レベルで定義する必要があります。

もちろん、それは、メソッド内の他のものもトップレベルに昇格する必要があることを意味する場合があります(つまり、そうなるでしょう)。

于 2015-04-22T15:30:28.970 に答える