viva Cocoa Objective-C 入門 第8章 ファイル入出力
ホーム メール
 
目次 < 前ページ 次ページ >

ネットワークからのテキストデータの読み込み

 前節ではローカルストレージからのテキストデータによるファイル入出力を行いました。この節ではネットワークストレージからのテキストデータの読み込み(入力)を行ってみたいと思います。

準備作業

■ バックアップをとる

 作業に入るまえにいつものようにバックアップを取ります。「バックアップを取ってください」という指示は今回を最後にしようと思います。次回からは読者が自らの判断でバックアップを取ってください。しかし今回だけは少し事情が違います。次の指示に従ってバックアップを取ってください。

  1. いつものようにMyClipプロジェクトをフォルダごと複製(コピー)をとります。このバックアップにはいつもの要領で名前をつけます。私の場合は「MyClip 8.1」にしました。8章1節のプロジェクトという意味です。すでに前節のバックアップをとれた方は再度この作業を行う必要はありません。
  2. もう一度MyClipプロジェクトをフォルダごとコピーをとります。そして今度はコピーしたほうのフォルダの名前を「MyClip 8.2Network」としてください。そしてこの節の作業だけはこのフォルダ内のプロジェクトを使って行います。

■ 読み込み用テキストデータを用意する

 次にネットワークストレージから読み込むテキストデータを用意して事前にネットワーク上にアップロードしておきます。次の例ではMacに付属している「テキストエディット」を使ってプレーンテキストデータを作成していますが、お好みのツールがあればそれを使っていただいても構いません。

  1. テキストエディットを起動して新規ファイルを開きます。
  2. 好きな文章を書いてください。私の場合は「これはネットワークから読み込んだテキストデータです。」という文章みしました。
  3. Mac付属のテキストエディットの場合は「フォーマット」メニューから「標準テキストにする」を選びます。

    図 テキストエディットでの作業1


  4. テキストファイルを閉じるか保存を選ぶか、あるいはテキストエディットの終了を選ぶと保存シートが現れます。シートで次のように設定します。
  5. デスクトップに作成したMyClipURL.txtをご契約されているプロバイダのサーバースペースなどのURLで場所を特定できるサーバースペースなどへアップロードしてください。

 以上で準備作業は終了しました。次項では実作業に入る前にネットワークからの読み込みメソッドについて説明いたします。

ネットワークからの読み込みメソッドの説明

この項の画像と説明はXcode 3.1で行っています。

 前節で紹介したNSString Class Referenceを再度開いてみてください。そして下へスクロールして今度は「Creating and Initializing a String an URL」グループの中から読み込みメソッドを探します。

図 NSString Class Reference 2

 すでに2つのメソッドが10.4以降で使えなくなっていることが分かります。残る4つもローカルストレージからの読み込みメソッドとほぼ同じです。違っているところは第1引数が必要としているデータの型が違う点だけです。

 ネットワーク(URL)からの読み込みメソッドを上から順番に簡単に説明していきます。

	+ (id)stringWithContentsOfURL:(NSURL *)url
		encoding:(NSStringEncoding)enc
			error:(NSError **)error

 コンビニエンスコンストラクタです。第1引数にはデータがあるURLを指定します。そして第2引数に文字エンコードを第3引数にエラーメッセージを格納する変数を指定しますがエラーメッセージが不必要であればNULLを指定することができます。

	- (id)initWithContentsOfURL:(NSURL *)url
		encoding:(NSStringEncoding)enc
			error:(NSError **)error

 前記メソッドのインスタンスメソッド版です。インスタンスメソッドですのでまずレシーバとなるインスタンスが必要になります。またこのメソッドで作成されたオブジェクトは一時オブジェクトではありません。そのほかの点は前述のメソッドと同じです。

	+ (id)stringWithContentsOfURL:(NSURL *)url
		usedEncoding:(NSStringEncoding *)enc
			error:(NSError **)error

 読み込むテキストデータの文字エンコードを自動で解析するコンビニエンスコンストラクです。そのほかの点は最初のコンビニエンスコンストラクタ・タイプの読み込みメソッドと同じです。

	- (id)initWithContentsOfURL:(NSURL *)url
		usedEncoding:(NSStringEncoding *)enc
			error:(NSError **)error

 前述の文字エンコード自動解析型の読み込みメソッドのインスタンスメソッド版です。前述のメソッドとの違いはレシーバとなるインスタンスが必要なことと作成されたオブジェクトが一時オブジェクトではない点です。

 今回も安定して文字通りコンビニエンスな最初のメソッドを使います。ここで問題となるのは第1引数をどうすれば良いだろうかということだと思います。

■ NSURL

「Creating and Initializing a String from an URL」ブループから最初のメソッド

	+ stringWithContentsOfURL:encoding:error:

 をクリックして詳細ページを表示してください。そして第1引数のNSURLというリンクをもう一度クリックします。

図 NSURL

 NSURL Class Referenceが開きます。下へスクロールしていってNSURLを作成するメソッドを探します。

	+ URLWithString:

 というメソッドが良さそうな気がします。これをクリックして詳細ページを表示します。

図 URLWithString

 正確なシグネチャは次のようになっているみたいです。

	+ (id)URLWithString:(NSString *)URLString

 冒頭には次のような説明文もあります。

Creates and returns an NSURL object initialized with a provided string.
 どうやらこのメソッドで間違いなさそうです。これで実装するメソッドの詳細も分かりました。次項では実際にコーディングしてMyClipネットワーク版を作成します。

MyClipネットワーク版の作成

■ コーディング

 MyClip 8.2Networkフォルダの中のMyClip.xcodeprojファイルをダブルクリックしてプロジェクトウィンドウを開いてください。今回だけいつもと違うフォルダのプロジェクトファイルを使います。フォルダを間違わないように注意してください。

 強調箇所が追加・変更されるコードです。Modelクラスに変更はありません。

Controller.h
#import <Cocoa/Cocoa.h> #import "Model.h" @interface Controller : NSObject { Model *model; IBOutlet NSTextView *textView; IBOutlet NSButton *button; } - (void)URL; - (void)writeToFile:(id)sender; @end
 メソッドreadFromFileをreadFromURLに変更しています。

Controller.m
 Controller.mで変更されるメソッドはinit、awakeFromNib、readFromFileの3つになります。

initメソッド
- (id)init { self = [super init]; if (self) { model = [[Model alloc] init]; [self readFromURL]; } return self; }
 ここでも[self readFromFile];を[self readFromURL];に変更しています。

awakeFromNibメソッド
- (void)awakeFromNib { [textView setString:[NSString string]]; //[textView setDelegate:self]; //[button setTarget:self]; [button setAction:@selector(writeToFile:)]; if ([model string]) [textView setString:[model string]]; [button setTitle:@"Save"]; }
 プッシュボタンに設定されるターゲットアクションを無効にすることによってネットワークから読み込んだデータでローカルストレージのデータをうっかりと上書きしてしまうことを防ぐために次の2つのメソッドをコメント化して無効にしています。
	[textView setDelegate:self];
	[button setTarget:self];


readFromFileメソッド
- (void)readFromURL { NSURL *url = [NSURL URLWithString: @"http://vivacocoa.jp/MyClipURL.txt"]; [model setString:[[NSString stringWithContentsOfURL:url encoding:4 error:nil] copy]]; }
  1. メソッド名をreadFromFileからreadFromURLに変更しています。
  2. メソッド冒頭でNSURL型のポインタurlを宣言してNSURLクラスのコンビニエンスコンストラクタURLWithString:メソッドでNSURLを作成して代入しています。Objective-Cにおいてもローカル変数はメソッド(関数)の冒頭で宣言しなければなりません。このコード例ではURLを私のサイトhttp://vivacocoa.jp/MyClipURL.txtにしていますが、この部分は読者がファイルをアップロードしたURLにしてください。
  3. stringWithContentsOfFile:メッセージをstringContentsOfURL:に変更しています。そして第1引数を冒頭で宣言したNSURL型のurlに変えています。

 以上でコードファイルの変更は終わりました。今回はMainMenu.xibファイルでの変更はありません。「Save」ボタンはクリックしても何のアクションも起こさないようにしています。


■ 実行

 プロジェクトウィンドウの「ビルドして進行」をクリックしてコンパイルします。MyClipアプリケーションが起動してURLにアップロードしたテキストデータがText Viewに表示されます。「Save」ボタンは何のアクションも起こさないのでローカルストレージのデータを変更してしまうこともありません。

図 MyClipネットワーク版起動画面



目次 < 前ページ 次ページ >


Copyright 2006 - 2010 viva Cocoa. All Rights Reserved.