*

iOSプログラミングのキモ(MainViewController説明 NSNotification/NSNotificationCenter これ大事)

公開日: : Apple, Computer Language, iOS, iPad, iPhone, Objective-C, XCode

前回のエントリの続きで 今回はNSNotification/NSNotificationCenterについて書いていきます、NSNotification/NSNotificationCenterはクラス・インスタンス間でメッセージの送受信を媒介してくれるクラスです。
NSNotification.001

NSNotification.002

プログラミングにおいて、クラス間の関係は必ず存在する訳ですが システムの実装過程において度重なる仕様変更・機能追加は避けて通れないものです。

当初決めたクラスの関係が 仕様変更・機能追加の過程の中で 問題になってくることも少なくありません。つまり柔軟性の高い(変化に強い)アプリを作るための秘訣はクラス間の関係を薄くしておくことが重要です。

オブジェクト指向プログラミングではJava・PHPでいうところのインターフェイス、Objective-Cでいうところのプロトコルが クラス間の相互関係を薄くしてくれる役割を果たしてくれるのですが、NSNotification/NSNotificationCenterはそれをさらに進めて お互いのことは全く知らなくても メッセージ交換が出来る事が とても重要です。

MainViewControllerクラスの中でNSNotificationに関係する部分を抜き出しました。

MainViewController.m – (void)viewDidLoadの中
NSNotificationCenterに対して、メッセージ受信を登録する

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(gDataURLChanged:) name:YOUTUBE_GDATA_URL_CHANGED object:nil];
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(regionChanged:) name:NOTIFICATION_COUNTRY_SELECTED object:nil];

メッセージ受信 その1
MainViewController.m -(IBAction)gDataURLChanged:(id)sender

-(IBAction)gDataURLChanged:(id)sender
{
    LOG(@"%@#gDataURLChanged sender=%@", [self class], sender);
    if(nowLoadding_)
        return;

    self.searchMode = NO;

    NSNotification *notification = (NSNotification*)sender;
    YouTubeGdataURL *youTubeGdataURL = (YouTubeGdataURL*)notification.object;
    gdataUrlFormat_ = youTubeGdataURL.url;
    self.navigationItem.title = youTubeGdataURL.title;

    LOG(@"%@#gDataURLChanged youTubeGdataURL.timeEnable=%d", [self class], youTubeGdataURL.timeEnable);
    switch (youTubeGdataURL.timeEnable) {
        case 1:
            timeEnable_ = YES;
            break;

        default:
            timeEnable_ = NO;
            break;
    }

    [self trimTableView];

    [refreshControl_ beginRefreshing];

    self.resetVideoArray = YES;
    startIndex_ = 1;
    allDataLoadding_ = NO;
    [self gdataLoad];

}

メッセージ受信 その2
MainViewController.m -(IBAction)regionChanged:(id)sender

-(IBAction)regionChanged:(id)sender
{
    NSNotification *notification = (NSNotification*)sender;
    CountrySetting *countrySetting = (CountrySetting*)notification.object;
    region_ = countrySetting.countryCode;
    self.navigationItem.rightBarButtonItem = [self getRightBarButtonItem];
    [self refreshOccured:sender];
}

メッセージの送信側の実装です、まだ解説していない 他のクラスの中です。
[[NSNotificationCenter defaultCenter]postNotificationName:YOUTUBE_GDATA_URL_CHANGED object:youTubeGdataURL];
が送信部分になります。

メッセージ送信 その1
LeftDemoViewController.m – (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    YouTubeURLs *youTubeURLs = (YouTubeURLs*)[jsonArray_ objectAtIndex:indexPath.section];
    YouTubeGdataURL *youTubeGdataURL = (YouTubeGdataURL*)[youTubeURLs.youTubeGdataURLs objectAtIndex:indexPath.row];
    
    [[NSNotificationCenter defaultCenter]postNotificationName:YOUTUBE_GDATA_URL_CHANGED object:youTubeGdataURL];
    
    [self.revealController showViewController:self.revealController.frontViewController];
}

メッセージ送信 その2
CountrySettingViewController.m – (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    LOG(@"%@#didSelectRowAtIndexPath",[self class]);
    
    selectedCountrySetting_.isSelected = [[NSNumber alloc]initWithInt:0];
    selectedCountrySetting_ = [countrySettingList_ objectAtIndex:indexPath.row];
    selectedCountrySetting_.isSelected = [[NSNumber alloc]initWithInt:1];
    
    selectedRow_ = indexPath.row;
    [[NSNotificationCenter defaultCenter]postNotificationName:NOTIFICATION_COUNTRY_SELECTED object:selectedCountrySetting_];
    
    AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
    countrySettingList_ = [appDelegate loadCountrySettingList];   
    
    [tableView reloadData];

    [self.revealController showViewController:self.revealController.frontViewController];
}

エントリーの最初に示した図のとおり、送信側・受信側共にお互いのクラスに関することが 全く記述されていません。このクラス間の関係が希薄になっていることが 柔軟性のあるシステムを作るコツでもあり、オブジェクト指向プログラミングの最大の利点なのです。

関連記事

iOSプログラミングのキモ(iOS7から使えるようになったマルチタスク機能、NSURLSessionUploadTask の困った現象)

このブログでも度々書いてきたFileQ iOS版ですが、今月末に Appleに申請できそうな

記事を読む

iOSプログラミングのキモ(MainViewController説明 : dispatch_asyncとブロック構文を使った 今どきのお手軽マルチスレッドプログラミング)

TwitterやYouTubeといったサービスでは、コンテンツの見出しにサムネイルが付加されることが

記事を読む

母校で特別 講義をやってきました。

少し 間が空いてしまいました(^_^;) ちょっと前になりますが、4月末に 同級生で 現在 母

記事を読む

iOSプログラミングのキモ(2:AppDelegate説明 )

実際の AppDelegate.h、AppDelegate.m のソースコードです AppDe

記事を読む

FileQ iOS版 公開しました。

5/2にFileQ iOS版を無事、公開しました。Appleの審査もスンナリ通り ホットしています(

記事を読む

iOSプログラミングのキモ(サードパーティ製ライブラリをサクッと入れるcocoapods)

iOSプログラミングでは 便利なライブラリがたくさんあります。特にUI系のライブラリは豊富で自分で作

記事を読む

iOSプログラミングのキモ(2:ソースコード概説 )主要なObjective-Cソース・ファイル一覧

QTubeの主要Objective-Cのソース一覧です。 iOSでは アプリを作る場合 Objec

記事を読む

iOSプログラミングのキモ(Delegate iOSプログラミングで避けて通れないしくみ)

Delegate(委任)の考え方を説明します。iOSのプログラミングでは このDelegateが頻繁

記事を読む

iOSプログラミングのキモ(デバッグをやりやすくするための工夫:コンソール・ログの出し方 )

iOS上でプログラミングをする時、ログ出力用の関数としてNSLogという関数をよく使います。NSLo

記事を読む

iOSプログラミングのキモ(iOS7から使えるようになったマルチタスク機能、NSURLSessionはこう使え!)

今日はQTubeのソースに関する話題ではなく、現在開発中のアプリで使っているNSURLSession

記事を読む

Comment

  1. nanateru より:

    NSNotification便利ですよね。
    使う上では、あと下記2点を気をつけるといいかもです。

    受信側のオブジェクトは、dealloc時に、[[NSNotificationcenter defaultCenter] removeObserver:self]を呼ぶ。
    -ゾンビオブジェクトにメッセージ送られてSIGBUSが発生する。

    マルチスレッドでやってる場合、送信側のpostNotificationのコードは、メインスレッドにディスパッチさせる。
    -メインスレッド以外でのUI操作による不穏な挙動を防ぐ。

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

FileQ Hosting 月額99円 容量1GB


サイト管理 Mezzanine
Django上で動くCMS Mezzanine 用のモジュールを作ってみる その1

Django上で動くCMS Mezzanine上で動く、モジュールを作

ホーム Mezzanine
Django上で動くCMS Mezzanine を インストールする MacOSX Yesemite 編

Mezzanineは Django WEBフレームワーク上で動くCMS

EclipseにGWT(Google Web Toolkit) Plugin for Eclipseを入れようとしてハマった

最近PHPでちょっとした業務システムを作りました。業務システムの特徴と

ブログを半年やった成果を Google Analytics から眺める

今年の1月からブログを書き始め、そろそろ半年が経とうとしています。

母校で特別 講義をやってきました。

少し 間が空いてしまいました(^_^;) ちょっと前になりますが

→もっと見る

mautic is open source marketing automation
PAGE TOP ↑