新規プロジェクトをView-based Applicationを選択して名前をMyNotificationとして作成してます。
新規ファイル追加で、NSObjectを継承したMyNotificationを作成しています。
以下、編集したファイルの中身です。
なるべく簡潔に分かりやすくを心がけたつもり。
// MyNotificationViewController.h
#import <UIKit/UIKit.h>
@interface MyNotificationViewController : UIViewController {
}
@end
// MyNotificationViewController.m
#import "MyNotificationViewController.h"
#import "MyNotification.h"
@implementation MyNotificationViewController
/*
* 通知受け取ったときに呼ばれる処理
*/
- (void)owatayo
{
NSLog(@"メインスレッド:通知owataを受け取ってowatayoメソッドを実行したよ。");
}
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"メインスレッド:処理開始");
// ここでは、通知を受けるObserverをselfとし、通知するSubjectをmyNotificationとする。
// 新しいスレッドをたて、その新スレッドからの通知を受け取れることの確認によって「監視」のテストとする。
MyNotification *myNotification = [[[MyNotification alloc] init] autorelease];
// NSNotificationCenterのインスタンスに、
// addObserver : 通知を受け取るオブジェクト(ここでは自分自身)
// selector : 通知を受けたときに実行するメソッド
// name : 通知される通知名
// object : どのオブジェクトからの通知を受け取るのか指定できる。nilであれば限定しない。
NSNotificationCenter *center;
center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(owatayo) name:@"owata" object:myNotification];
// 新しいスレッドをたて、myNotificationのmyWorkメソッドを実行する。
[NSThread detachNewThreadSelector:@selector(myWork) toTarget:myNotification withObject:nil];
NSLog(@"メインスレッド:処理終了");
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)viewDidUnload {
}
- (void)dealloc {
[super dealloc];
}
@end
// MyNotification.h
#import <Foundation/Foundation.h>
@interface MyNotification : NSObject {
}
- (void)myWork;
- (void)didMyWork;
@end
// MyNotification.m
#import "MyNotification.h"
@implementation MyNotification
/*
* 新スレッドでの処理
*/
- (void)myWork
{
NSLog(@"新スレッド:処理開始");
NSAutoreleasePool *pool;
pool = [[NSAutoreleasePool alloc] init];
for (int i=0; i<5; i++) {
[NSThread sleepForTimeInterval:1.0];
NSLog(@"新スレッド:%d", i);
}
[self didMyWork];
[pool release];
NSLog(@"新スレッド:処理終了");
[NSThread exit];
}
/*
* 新スレッド終了するときの通知させる処理
*/
- (void)didMyWork
{
// 通知を受け取る側では以下のようにobserverをNSNotificationCenterに追加している。
// NSNotificationCenter *center;
// center = [NSNotificationCenter defaultCenter];
//[center addObserver:self selector:@selector(owatayo) name:@"owata" object:myNotification];
//
// name:@"owata" と notificationWithName:@"owata" で指定している @"owata" をキーとして通知のやりとりを行う。
// 後は、NSNotification の postNotification: で通知を送れば、勝手に通知を受け取ってくれる。
NSNotification *notification;
notification = [NSNotification notificationWithName:@"owata" object:self userInfo:nil];
NSLog(@"新スレッド:通知を送るよ。通知の名前はowataだよ。");
NSNotificationCenter *center;
center = [NSNotificationCenter defaultCenter];
[center postNotification:notification];
}
@end
こんな感じにログがでるはず。
2010-10-15 18:51:43.333 MyNotification[2310:207] メインスレッド:処理開始
2010-10-15 18:51:43.336 MyNotification[2310:5c03] 新スレッド:処理開始
2010-10-15 18:51:43.336 MyNotification[2310:207] メインスレッド:処理終了
2010-10-15 18:51:44.337 MyNotification[2310:5c03] 新スレッド:0
2010-10-15 18:51:45.338 MyNotification[2310:5c03] 新スレッド:1
2010-10-15 18:51:46.339 MyNotification[2310:5c03] 新スレッド:2
2010-10-15 18:51:47.341 MyNotification[2310:5c03] 新スレッド:3
2010-10-15 18:51:48.342 MyNotification[2310:5c03] 新スレッド:4
2010-10-15 18:51:48.343 MyNotification[2310:5c03] 新スレッド:通知を送るよ。通知の名前はowataだよ。
2010-10-15 18:51:48.344 MyNotification[2310:5c03] メインスレッド:通知owataを受け取ってowatayoメソッドを実行したよ。
2010-10-15 18:51:48.345 MyNotification[2310:5c03] 新スレッド:処理終了
追記:赤文字の部分にちょっと注意が必要そうなので、次の記事でそのこと書く。今回書いたサンプルコードではスレッド・セーフになってなさそう。
あれ?もしかして、NSNotification と NSNotificationCenter 使うと超簡単だったりするんじゃないの?
続く。
0 件のコメント:
コメントを投稿