Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/112-7618216c

-件のトラックバック

-件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

【Objective-C】delegate

起動引数にURLを付けると、標準出力にレスポンスを出力するCUIアプリでをObjective-Cで書いてみる。

#import <Foundation/Foundation.h>

@interface Hoge : NSObject {
NSMutableData *receivedData;
bool finished;
}
- (id) loadTableDataFromURL:(NSString *) url;
@end

@implementation Hoge
- (id) loadTableDataFromURL:(NSString *)url {
self = [super init];
receivedData = [[NSMutableData data] retain];

NSURLRequest *theRequest = [NSURLRequest requestWithURL: [NSURL URLWithString: url]];
NSURLConnection *theCon =[[NSURLConnection alloc] initWithRequest: theRequest delegate:self];
if(!theCon){
NSLog(@"err connection");
}

//※1
while(!finished) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
}

return self;
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
[receivedData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
[connection release];
[receivedData release];
NSLog(@"err connection");
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection{
finished = TRUE;
NSLog(@"%@",[[[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding] autorelease]);

[receivedData release];
[connection release];
}
@end

int main (int argc, const char *argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSString *urlstr = [NSString stringWithCString: argv[1] encoding: NSUTF8StringEncoding];
Hoge *hoge = [[Hoge alloc] loadTableDataFromURL: urlstr];
[hoge release];

[pool release];
return 0;
}

※1
参考:http://www.depl0y.com/2009/02/20/nsurlconnection-in-its-own-thread/
このループを入れないと上手く行かない。
非常に美しくないので、気に入ってないが、実際にXcodeで作るアプリはこういう事は起こらないので気にしない事にする。

これと機能的に同じ物をRubyで書くとしたら、

#!/usr/bin/ruby
require 'open-uri'

open(ARGV[0]) do |f|
print f.read
end

となるのだが、ここでふと思う。

RubyやJavascriptで書いてて「delegate」を意識した事が全くない。

なので今回は、Rubyで「delegate」するクラスを書いてみようと思う。

#!/usr/bin/ruby
require 'open-uri'

class Connection
def initialize(url,delegate)
@_delegate=delegate if delegate
begin
open(url) do |f|
self.didReceiveData(f.read)
end
rescue
self.didFailWithError($!)
end
self.connectionDidFinishLoading
end

def didReceiveData(data)
@_delegate.didReceiveData(data) if @_delegate
end

def didFailWithError(err)
@_delegate.didFailWithError(err) if @_delegate
end

def connectionDidFinishLoading
@_delegate.connectionDidFinishLoading if @_delegate
end
end

class Hoge
def initialize(url)
@data=''
Connection.new(url,self)
end

def didReceiveData(data)
@data+=data
end

def didFailWithError(err)
STDERR.puts err
end

def connectionDidFinishLoading
print @data
end
end

Hoge.new(ARGV[0])

なんか、Objective-Cぽくなったw
この記事に対してトラックバックを送信する(FC2ブログユーザー)
http://kovayashi.blog120.fc2.com/tb.php/112-7618216c

0件のトラックバック

0件のコメント

コメントの投稿

投稿フォーム
投稿した内容は管理者にだけ閲覧出来ます

Appendix

プロフィール

kovayashi

Author:kovayashi
・嫌いなもの
 →好きなもの

・インストール
 →バンドル
・バックアップ
 →アップロード
・努力
 →チート

最近のトラックバック

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。