dispatch_async内での参照について
swift
C++クラスを動かすためのObje-C++
C++(拡張子はmm)
上記のクラスがある状態で、
swift→Obje-C++→C++→Obje-C++→swiftの流れで処理させようとしています。
swiftからは
private var queue: dispatch_queue_t = dispatch_queue_create("test.test.testcall", DISPATCH_QUEUE_SERIAL)
dispatch_async(queue, {
// Obje-C++のクラスのメソッドを呼び出す
})
C++の処理結果をObje-C++から下記のような形で通知を行い、
NSData* info = [NSData dataWithBytes:(const void*)info length: sizeof(info)];
NSDictionary *dictionary = @{@"info": info,
@"data1":[NSNumber numberWithInt: data1],
@"data2":[NSNumber numberWithInt: data2]};
NSNotification *notification = [NSNotification notificationWithName: @"testNotification" object: nil userInfo: dictionary];
[[NSNotificationCenter defaultCenter] postNotification: notification];
swift側で以下のような形で処理をしています。
private var queue: dispatch_queue_t = dispatch_queue_create("test.test.test", DISPATCH_QUEUE_SERIAL)
@objc private func testNotification(notification: NSNotification) {
dispatch_async(queue, {
guard let info = notification.userInfo?["info"] as? NSData else {
return
}
guard let data1 = notification.userInfo?["data1"] as? NSNumber else {
return
}
guard let data2 = notification.userInfo?["data2"] as? NSNumber else {
return
}
// 処理
})
}
動いてはいるのですが、処理を繰り返すと、
最後のswiftの通知の受信箇所で取り出した中身が空だったりしてしまいます。
そこで、わからなくなってきてしまったのですが、testNotification()の
dispatch_async()内でパラメータnotificationを参照していますが、
これはtestNotification()で渡ってきた値のコピー?を参照している認識なのですがあっているのでしょうか・・・
testNotification()が複数回呼ばれた場合もキューにはそれぞれのnotificationのコピーが渡るので、正しく参照できる!
と考えているのですが、認識違いでしょうか。
dispatch_async(queue, {
/// ここで参照
})