ぜん通。

<ぜんつう>ネトゲとかソシャゲとか、雑記。

   
カテゴリー「iPhoneアプリ開発備忘録」の記事一覧

簡単な非同期処理

 通信を行わない処理中に急に非同期で他メソッドを呼びたくなる時がある。

例えば処理は続けたいけど、画面上ではアラートを出しておきたいとか。
でも一々それだけの為にNotificationを使うのも面倒。

そんな時に簡単に非同期処理を行えるメソッドがこれ。

[self performSelector:@selector(hoge:) withObject:obj afterDelay:1.0];

performSelector:呼ぶメソッドを@selectorで指定。
withObject:引数はobjに設置。
afterDelay:呼ばれるまでの時間を設定


結構便利。

拍手[0回]

便利なiOSからのNotification通知

 アプリ終了時の動作や復帰時の動作を仕込む場合、大元のDelegateで最初から定義されている
- (void)applicationDidEnterBackground:(UIApplication *)application;
- (void)applicationWillEnterForeground:(UIApplication *)application;
が呼ばれるので、そこから遠回りして停止時(サスペンド)と復帰時(レジューム)の処理を行う事が出来る。
 
だがNotifcationを使用すると好きな場所でその停止と復帰の通知を取得でき、処理を行える
 
詳しくは以下の記事を参照。
http://iphone-dev.g.hatena.ne.jp/paella/20090802/1249223841
 
基本的にはNotifocationCenterに登録するだけ。
 
別のクラスで同じNotificationNameで登録した場合、後から登録した方しか呼ばれなくなるので
必ず同時に二つの登録を行い輪無いように注意。
 
アプリの停止と復帰だけでなく、OS側から通知されるNotificationは他にも多くあるので要チェック。
 
余談だが、アプリ停止時の処理は5秒内に終わらせよう。
5秒以上たってしまうとOS側で処理を止められる可能性がある。

拍手[0回]

非同期通信での通知方法

 非同期処理での、処理完了通知の出しかた。
 
方法1 Notificationを使う
 
 
1,Notificationの登録
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(Receive:) name:nil object:nil];
 [受け取り側]上記記載を行う事で、どっかしらでNotificationに通知を出したらReceive:が呼ばれるように登録しました。
 
 
2,Notificationの通知
 [[NSNotificationCenter defaultCenter] postNotificationName:@"HOGE" object:nil];
[送る側]上記記載を通知したい側に記載する事で、"HOGE"という通知を行います。
3,Notificationの受信
 
 - (void)Receive:(NSNotification *)receiveNotification{
if( [receiveNotification name] == @"HOGE" ){
// Notifocationの登録解除
[[NSNotificationCenter defaultCenter] removeObserver:self name:nil object:nil];
}
}
[受け取る側]通知で使われるNotifocationNameが"HOGE"だった場合のみ、動作させます。
受信し終わったらNotificationの登録を解除します。
方法2 DelegateとSelectorを渡す。
 
1, 非同期の関数を呼ぶ際に一緒にDelegateとSelectorを渡す。
 
 [hoge HogeSend:@"test" delegate:self selector:@selector(test:)];
 
 -(void) test : (NSString*)str {
 
 
 }
 
 
2,非同期処理で処理が終わった事を通知したい方は受け取ったDelegateのセレクタをコールする。
 
 - (void) HogeSend : (NSString*) delegate:(id)del selector:(SEL)sel {
 
 // 処理
 
 [del performSelector:sel];

拍手[0回]

iPhone実機での通信切断試験

 iPhone端末で通信の切断試験を行う場合MacBookをアクセスポイントとしてWifi接続し、
MacBook側で通信を操作する事によってiPhone端末上で通信切断をアプリ上で確認する事ができる。
 
 

拍手[1回]

[iPhoneアプリ開発]引っかかったエラー

 コーディングをしていて、引っかかったエラー。

  "○ ○○○○○○○○○○○○○○○○○○", referenced from:

-[△△△△△△△ □□□□□□□□□□□:] in  △△△△△△△.o

ld: symbol(s) not found

collect2: ld returned 1 exit status



こんなエラーコード。 エラー該当行を示してくれない奴。
「シンボル」って事は変数名とか関数名が間違ってたり、引数が違うのかと思えばそうではなかった。

おいらの場合「ヘッダファイルに関数定義はあるけど、ソースファイルには関数の実体がない」のが原因でした。
全部Objective-Cで書かれてればエラー該当行が出そうな気もするが、C++だとでないみたいだ。

 

拍手[0回]

【iPhoneアプリ開発】SQLite3で日付データを扱う

SQLite3を使ってた中で、問題になったのはDate型を実装できないこと。
SQLite3上で日付を扱いたい場合はデータ型はtext形で作る必要がある。

データは必ず以下の形式で格納する。
YYYY-MM-DDTHH:MM:SS

まずはORDER BY などで降順昇順に並び替える場合。
例) Select * From TestTable Order by 日付
文字列だが、形式がちゃんとしてれば普通にORDER BYするだけで問題ない。


日付の比較をしたい場合(公開日時が現時刻より古いレコードを探す)
例) Select * From TestTable Where julianday(公開日時) <= julianday(datetime('now', 'localtime'))
julianday()は決まった形式の文字列をユリウス暦に置き換えて計算してくれます。
ユリウス暦とはある基点となる時点から、その日付までの秒数?を足した整数値で
かなりの桁がある整数値です。


拍手[0回]

【iPhoneアプリ開発】テーブルでWeb上の画像を表示

 Tiwtterのクライアントアプリみたいに、TableViewでWeb上にある画像を各セルで表示したい。

しかし、馬鹿正直に「cellForRowAtIndexPath」関数内で「ImageView.image = Web上の画像」なんてやったら
テーブルをスクロールしたタイミングで、新しく表示するセルに描画する画像データを取りに行ってしまうため
なめらかなスクロールどころか、画像を表示する際に画面が固まってしまいます。

そこでテーブルをスクロールしたタイミングで、新しく表示するセルのImageViewにWeb上の画像を描画する処理をスレッドに登録(非同期に)することで、スクロール時に固まらなくなります。

下記サイト様が参考になります。
http://d.hatena.ne.jp/yuum3/20101216/1292490323

私が使用したソースはつづきへ

拍手[1回]

【iPhoneアプリ開発】左側が尖ってる戻るボタン

 ナビゲーションバーを使って画面遷移すると、次の画面のナビゲーションバーの左側に、前の画面に戻るためのボタンが勝手に作成される。
前の画面のタイトルが長すぎたり、次の画面のタイトルが長すぎたりした際に、ナビゲーションバーに収まりきらないなんて事もある。

そこで、ナビゲーションバーの左側には「戻る」ボタンを配置する。


 
UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];
temporaryBarButtonItem.title = NSLocalizedString(@"BackButtonName", @"");
self.navigationItem.backBarButtonItem = temporaryBarButtonItem;
[temporaryBarButtonItem release];

上記コードで左側が尖っていて、なお「戻る」という短いボタンが作れる。

拍手[0回]

【iPhoneアプリ開発】役に立ったサイト様の紹介

 【iPhoneアプリ開発】役に立ったサイト様の紹介

要は、iPhone開発で参考にしたブログ記事のブックマークをまとめたってだけの話。


Web上からデータを取ってきて、適当な文字コードでデコードする。
http://d.hatena.ne.jp/terazzo/20090109/1231535533


scrollViewの実装の仕方
http://ameblo.jp/xcc/entry-10322378932.html


時間の計算

正直、何に使ったか覚えてないURLもあるけど、とりあえずメモとして残しておく事に。

拍手[0回]

【iPhoneアプリ開発】NSDateを使った毎秒処理

 NSDateを使って何秒間に1回決まった関数を呼び出す処理です。

①呼び出す間隔と関数を設定する。
②設定後常に関数は呼ばれ続けるが、flgがFALSEのため処理は行わない。
③Startボタンが押されたらflgがTRUEになり、処理が行われる。
また、StartボタンをStopボタンに変える。
④Stopボタンが押されたらFlgをFLASEに戻す。


@implementation RootViewController

NSDate *date_now;
BOOL time_flg=FALSE;


- (void) viewDidLoad {
UIBarButtonItem *play = [[UIBarButtonItem alloc] 
initWithBarButtonSystemItem:UIBarButtonSystemItemPlay 
target:self 
action:@selector(start_down:)]; // Slideshow を開始するボタン
// 何秒間に1回どの関数をコールするかを設定する。(下記記述では0.01秒間に1回onTimerがコールされる)
timer = [NSTimer scheduledTimerWithTimeInterval:(0.01) 
target:self selector:@selector(onTimer:)
userInfo:nil repeats:YES];
}


/* 画面が解放される際にタイマーを停止 */
- (void)viewDidDisappear:(BOOL)animated {
[timer invalidate];
}


/* タイマーに登録されたメソッド */
-(void)onTimer:(NSTimer*)timer {
    if(time_flg){
        //Stopが押されるまでに毎回行う処理
[now release];
    }
}


/* スタートボタンが押された時に呼ばれる */
-(IBAction) start_down:(id) sender{

UIBarButtonItem *stop = [[UIBarButtonItem alloc] 
initWithBarButtonSystemItem:UIBarButtonSystemItemStop 
target:self 
action:@selector(stop_down:)]; // 停止ボタンを生成
self.navigationItem.rightBarButtonItem = stop;
[stop release];

    time_flg = TRUE;
    date_now = [NSDate date];
    [date_now retain];
}


/* ストップボタンが押された時に呼ばれる */
-(IBAction) stop_down:(id) sender{
    time_flg = FALSE;
UIBarButtonItem *start = [[UIBarButtonItem alloc] 
initWithBarButtonSystemItem:UIBarButtonSystemItemPlay 
target:self 
action:@selector(start_down:)]; // 開始するボタンを生成
self.navigationItem.rightBarButtonItem = start;
[start release];
if(animetionFlg){
[date_now release];
}
animetionFlg = FALSE;
}

拍手[0回]

カウンター

マジモン窓

プロフィール

HN:
Zenchuu
性別:
男性
職業:
えんじにあ
自己紹介:
いわゆるオタク系。
HNのzenchuuは子供のころからのあだ名。
iPhoneアプリの制作〜運用を仕事にしてます。
人間強度は最高レベルだと自負。
友達?要らねーよヽ(´ー`)ノ

Twitter

いろいろ

Copyright ©  -- ぜん通。 --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS /  /