第8章 ファイル入出力 | ||
ホーム | メール | |
目次 | < 前ページ 次ページ > |
前節ではローカルストレージからのテキストデータによるファイル入出力を行いました。この節ではネットワークストレージからのテキストデータの読み込み(入力)を行ってみたいと思います。
作業に入るまえにいつものようにバックアップを取ります。「バックアップを取ってください」という指示は今回を最後にしようと思います。次回からは読者が自らの判断でバックアップを取ってください。しかし今回だけは少し事情が違います。次の指示に従ってバックアップを取ってください。
次にネットワークストレージから読み込むテキストデータを用意して事前にネットワーク上にアップロードしておきます。次の例ではMacに付属している「テキストエディット」を使ってプレーンテキストデータを作成していますが、お好みのツールがあればそれを使っていただいても構いません。
以上で準備作業は終了しました。次項では実作業に入る前にネットワークからの読み込みメソッドについて説明いたします。
この項の画像と説明は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引数をどうすれば良いだろうかということだと思います。
「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 8.2Networkフォルダの中のMyClip.xcodeprojファイルをダブルクリックしてプロジェクトウィンドウを開いてください。今回だけいつもと違うフォルダのプロジェクトファイルを使います。フォルダを間違わないように注意してください。
強調箇所が追加・変更されるコードです。Modelクラスに変更はありません。
メソッドreadFromFileをreadFromURLに変更しています。#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
ここでも[self readFromFile];を[self readFromURL];に変更しています。- (id)init { self = [super init]; if (self) { model = [[Model alloc] init]; [self readFromURL]; } return self; }
プッシュボタンに設定されるターゲットアクションを無効にすることによってネットワークから読み込んだデータでローカルストレージのデータをうっかりと上書きしてしまうことを防ぐために次の2つのメソッドをコメント化して無効にしています。- (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"]; }
[textView setDelegate:self]; [button setTarget:self];
- (void)readFromURL { NSURL *url = [NSURL URLWithString: @"http://vivacocoa.jp/MyClipURL.txt"]; [model setString:[[NSString stringWithContentsOfURL:url encoding:4 error:nil] copy]]; }
以上でコードファイルの変更は終わりました。今回はMainMenu.xibファイルでの変更はありません。「Save」ボタンはクリックしても何のアクションも起こさないようにしています。
プロジェクトウィンドウの「ビルドして進行」をクリックしてコンパイルします。MyClipアプリケーションが起動してURLにアップロードしたテキストデータがText Viewに表示されます。「Save」ボタンは何のアクションも起こさないのでローカルストレージのデータを変更してしまうこともありません。
図 MyClipネットワーク版起動画面
目次 | < 前ページ 次ページ > |