.-- --

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
スポンサー広告 comment(-) trackback(-)
.29 2009

ネットワークプログラミング入門編(4)

Tasaki です。

昨日は、製品アップデートのお知らせでしたので、間が空いてしまいましたが今回はネットワークプログラミング入門編の続きです。

前回、レスポンスの取得法について触れましたが、今回は実際のコード例をご紹介します。
例えばHTTPレスポンスから、特定のヘッダ情報を読み取る場合はこのように記述します。
- ( void ) connection:( NSURLConnection *) connection didReceiveResponse:( NSURLResponse *) response {
if([ response isKindOfClass:[ NSHTTPResponse class ]]) {
  NSHTTPURLResponse *httpResponse = ( NSHTTPURLResponse *) response;
  NSString *headerValue = [[ httpResponse allHeaderFields ] stringForKey: @"AnyValue" ];
  if([ headerValue isEqualToString: @"1" ]) {
   // 成功時の処理
  } else {
   // 失敗時の処理
  }
 }
 [ connection release ];
}

このコードについて解説しますと、まず response が NSHTTPURLResponse オブジェクトかどうかを調べています。HTTPリクエストを送っていれば、HTTP レスポンスが渡されているはずです。
それから、レスポンスのヘッダ情報の中から AnyValue という特定のヘッダ情報の値を取得しています。この場合、サーバ側では処理に成功すると1を、失敗すると0を書き込むと想定していますので、クライアント側ではその値によって処理を分岐するようにしています。
最後に connection をリリースしていますが、これはコネクションの作成時に init... を使用していた場合に必要な措置です。今回は、レスポンスまでしか必要でなかったので、ここでリリースしちゃってますが、本来なら送受信の最後に呼びだされるデリゲートメソッドでこの解放処理をすべきでしょう。また、コネクション失敗時のデリゲートメソッドでも同様の処理を実装する必要があります。



スポンサーサイト
.28 2009

PictureLabeler が本日アップデートされました

Tasaki です。

先週提出していた PictureLabeler のアップデート版が本日リリースされました。
肝心のアップデート内容はといいますと、アプリケーションのアイコンを変更しただけなんですけども。
これだけの変更でも、審査に出さなきゃいけないっていうのは面倒というか、それだけのために1週間待たなきゃいけないのは、どうにかならないのかと思います。

それにしても、1.0.0 提出時は、何の連絡も無く AppStore に並んでたわけですが、今回はリリース前の告知がきちんとありました。
ただ、リリース日が提出日になっていたのには納得いかないですね。なんで、こんな仕様なんでしょうか。


.27 2009

ネットワークプログラミング入門編(3)

Tasaki です。

今回はレスポンスの取得についてのお話です。
iPhone プログラミングでは、イベントのハンドルにデリゲートを使用することが一般的ですが、レスポンスの取得もこの方法で行います。
前回紹介したコネクションの作成時にデリゲートオブジェクトを指定しましたので、後はレスポンス受信時のデリゲートメソッドを実装すればよいことになります。

実装すべきメソッドはこれです。
- ( void ) connection:( NSURLConnection *) connection didReceiveResponse:( NSURLResponse *) response;

connection は通信に使用しているコネクションを、response は、サーバからのレスポンスを表すオブジェクトです。
なお、このメソッドは正常にリクエストが送信されレスポンスを取得した場合に呼び出されるものですので、これ以外に通信に失敗した場合のデリゲートメソッドも実装しておく必要があります。
そのためのメソッドがこちらです。
- ( void ) connection:( NSURLConnection *) connection didFailWithError:( NSError *) error;

このメソッドの引数に関しては、説明は不要かと思いますので省略します。

以上2つのメソッドを実装することで、レスポンスが返されたか、エラーが発生したかが分かります。

というところで、具体的な実装例は次回に回したいと思います。


.26 2009

ネットワークプログラミング入門編(2)

Tasaki です。

ネットワークプログラミング入門編の2回目は、リクエストとコネクションの作成法について解説します。

前回、リクエストとコネクションそれぞれに対応するクラス NSURLRequest、NSURLConnection をご紹介しましたが、これを適切に初期化してやるだけで HTTP リクエストをサーバに送信することができます。

まずはリクエストからですが、初期化には以下のメソッドを使用します。

- ( id ) initWithURL:( NSURL *) url cachePolicy:( NSURLRequestCachePolicy ) cachePolicy timeoutInterval:( NSTimeInterval ) timeoutInterval;
+ ( id ) requestWithURL:( NSURL *) url cachePolicy:( NSURLRequestCachePolicy ) cachePolicy timeoutInterval:( NSTimeInterval ) timeoutInterval;

url には、URL オブジェクトを渡します。詳細は後述します。cachePolicy はURLリクエストのキャッシュデータの読み込みに関するランタイムの動作を指定します。例えばキャッシュデータを使用しない場合には、NSURLRequestReloadIgnoringLocalCacheData (長過ぎ)を指定します。timeoutInterval には、リクエストを時間切れとみなすまでの待ち時間(秒数)を指定します。

URL オブジェクトについてですが、これは URL を保持するためのオブジェクトで、以下のように URL を文字列として渡して初期化します。

+ ( id ) URLWithString:( NSString *) URLString;
- ( id ) initWithString:( NSString *) URLString;

このオブジェクトは、与えられた URL のホスト名やクエリをその部分だけ取得することができる便利なオブジェクトではありますが、今回のように直接 URL の全文を与える場合には、かえって回りくどいコードになってしまいます。

次にコネクションのイニシャライザを以下に示します。

+ ( NSURLConnection *) connectionWithRequest:( NSURLRequest *) request delegate:( id ) delegate;
- ( id ) initWithRequest:( NSURLRequest *) request delegate:( id ) delegate;

request には、予め作成しておいたリクエストを delegate には、レスポンスやデータがサーバから渡されたときに対処するデリゲートオブジェクトを指定します。
なお、サーバとの通信には、同期通信と非同期通信の2通りがありますが、今回ご紹介したのは非同期通信を行う場合のものです。
この返り値として、有効なコネクションオブジェクトが返されると、サーバに対してリクエストの送信が行われます。

これを踏まえて、簡単なリクエスト送信の流れを以下に示します。

- ( BOOL ) requestToServer:( NSString *) urlString {
NSURLRequest *request = [ NSURLRequest requestWithURL:[ NSURL URLwithString: urlString ] cachePolicy: NSURLRequestReloadIgnoringLocalCacheData timeoutInterval: 60.0 ];
if( request == nil ) {
  return NO;
 }
NSURLConnection *connection = [ NSURLConnection connectionWithRequest: request delegate: self ];
return ( connection != nil );
}


次回はレスポンスの取得についてですが、デリゲートプログラミングに馴染んでいれば、解説の必要はないかもしれません。

.25 2009

ネットワークプログラミング入門編(1)

Tasaki です。

今回はネットワークプログラミングに関するテーマを取り上げます。と言うのも、Mac や iPhone のプログラミング関連の書籍や Web サイトはいくつもありますけど、ネットワークプログラミングの初心者に向けた解説ってほとんど見受けられなかったからです。(英文ならあるのかもしれませんが)

まずはじめに、iPhone では大まかに言うとネットワークに対して以下の三種類のアプローチが可能です。
・NSURLConnection 等の Objective-C で書かれた API を使用する方法
・CFNetwork フレームワークを利用する方法
・BSD ソケットを自分で生成するなど1からやる方法

後に挙げた項目ほど初心者には敷居が高く、たくさんのコードを記述する必要があります。その分、自由度は高まる訳ですが。
公式ドキュメントでは、2番目に挙げた CFNetwork を勧めていますが、ドキュメントが分かりにくく、それなりの量のコードも書かなければいけなさそうな雰囲気です。

ということで、1番簡単と思われる NSURLConnection 等を使用した HTTP 通信について解説していこうと思います。
なお、ここでは iPhone アプリをクライアントサイドとして話を進めます。
またサーバサイド(サーブレット)については詳しく触れません。

それでは、実際にコーディングに入る前に、今回使用するオブジェクトたちをご紹介します。

クラス名説明
NSURLConnectionサーバとの通信を管理するオブジェクトです。これがないと始まりません。
NSURLRequestHTTP リクエストを表すオブジェクトです。URL を初期化時に渡します。
NSHTTPURLResponse

( NSURLResponse )

HTTP レスポンスを表すオブジェクトです。サーバから渡されます。


考え方としては、リクエストをコネクションに渡してサーバと通信してもらい、レスポンスが返されたらそれを受け取る、と言った具合です。

次回はリクエストとコネクションの作成について具体的に見ていきます。





.22 2009

タイムゾーンの取得と設定

Tasaki です。

今回のテーマはタイムゾーンの扱い方についてです。

このタイムゾーンの設定によって、NSDate オブジェクトの属性が変わってきます。
タイムゾーンは NSTimeZone というオブジェクトを使用して管理します。

時計に限らず、アプリによっては特定のタイムゾーンを設定したい場合が生じると思います。
アプリの初期化時には、デフォルトではシステムのタイムゾーンを設定されますが、プログラマが自由にこれを変更することが可能です。

アプリのタイムゾーンを変更するには、以下のメソッドを使用します。
+ ( void ) setDefaultTimeZone:( NSTimeZone *) timeZone;

また、タイムゾーンオブジェクトの生成には、以下のメソッドを使用します。
+ ( id ) timeZoneWithName:( NSString *) name;
- ( id ) initWithName:( NSString *) name;
name には、タイムゾーン名を与えることになりますが、その前にタイムゾーン名がどのように定義されているかを知っておく必要があります。
定義されたタイムゾーン名を取得するためのメソッドがこちらです。
+ ( NSArray *) knownTimeZoneNames;
返り値は、既知のタイムゾーン名となっています。
これによると、日本標準時(というか東京時間?)は、Asia/Tokyo だそうです。

これを踏まえて、タイムゾーンを日本標準時に設定する処理を以下に示します。
NSTimeZone *newTimeZone = [[ NSTimeZone alloc ] initWithName: @"Asia/Tokyo" ];
[ NSTimeZone setDefaultTimeZone: newTimeZone ];


この他にも省略名を使ってタイムゾーンを設定することもできるようで、いろいろなメソッドが用意されているみたいです。(サマータイム関連のものとか)
複数のタイムゾーンを一度に扱う場合は、デフォルトをグリニッジ標準時にしておくと混乱せずに済みそうです。


.21 2009

PictureLabeler のアイコンを変更しました

Tasaki です。

本日、PictureLabeler のマイナーアップデートを申請致しました。
変更内容はアイコンのみではありますが…。
レビュー等でご指摘の件についての改良も行う予定ですが、ただいま別の作業に掛かり切りになってまして、すぐに修正できそうにはありません。ご了承ください。
また、次回アップデートの際には、合わせて無償版の提供も行う予定です。

.20 2009

CoreData について (6)

Tasaki です。

今回でひとまず CoreData の簡単な使い方の解説は終了とします。
最後のテーマは、データの抽出方法についてです。

前回、データベースからデータを読み込む手順を取り扱いましたが、あのままではあるエンティティの全てのデータを取り出してしまいます。
当然、データベースから全てのデータを取り出すなんてこと普通はありませんから、条件を満たしたデータだけを抽出する必要がありますよね。
このときに使用するのが、NSPredicate (述語)オブジェクトです。
前回出てきた受信要求 (NSFetchRequest) クラスに、このオブジェクトを設定することで抽出条件を指定することが可能です。
そのためのメソッドがこちらです。
- ( void ) setPredicate:( NSPredicate *) predicate;

また、述語オブジェクトの作成には以下のメソッドを使用します。
+ ( NSPredicate *) predicateWithFormat:( NSString *) format, ... ;

これは、printf()でおなじみの文字列と可変引数を与えて述語を作成します。この引数部分に、条件式を与えることになります。
例えば、MyData エンティティの floatValue が 0 より大きいもの、という条件にしたい場合は以下のように記述します。
NSFetchRequest *request = [[ NSFetchRequest alloc ] init ];
NSEntityDescription *entity = [ NSEntityDescription entityForName: @"Sites" inManagedObjectContext: managedObjectContext ];
[ request setEntity: entity ];
NSPredicate *predicate = [ NSPredicate predicateWithFormat: @"floatValue > 0.0" ];
[ request setPredicate: predicate ];

この後、前回のコードと同じように要求を送ると条件に合致したデータだけが返されます。

なお、条件式の内部では以下の単語が予約語として使われているようです。
AND, OR, IN, NOT, ALL, ANY, SOME, NONE, LIKE, CASEINSENSITIVE, CI, MATCHES, CONTAINS, BEGINSWITH, ENDSWITH, BETWEEN, NULL, NIL, SELF, TRUE, YES, FALSE, NO, FIRST, LAST, SIZE, ANYKEY, SUBQUERY, CAST, TRUEPREDICATE, FALSEPREDICATE


.19 2009

CoreData について (5)

Tasaki です。

CoreData の紹介もついに 5 回目に突入しました。
今まで、これだけシリーズ化したテーマはなかったので、ちょっと食傷気味なところもありますが、がんばっていきたいと思います。

今回は、ついに(といいますか、やっと)データベースからのデータの読み出しについて解説します。

手始めに、登録されたデータをある属性について降順で取得した配列を返すメソッドを作成してみます。

データの読み出しは、以下の流れで行います。
①エンティティの指定
②受信要求の作成
③ソート順序の指定
④受信要求の実行
⑤配列からデータを表示

なお、今回も MyData エンティティを使用したサンプルコードを示します。

まずエンティティの指定ですが、これには以下のメソッドを使用します。
+ ( NSEntityDescription *) entityForName:( NSString *) name inManagedObjectContext:( NSManagedObjectContext *) context;

name には、エンティティ名を context には、管理オブジェクトコンテキストを指定します。

次の受信要求の作成については、alloc - init で行います。
この後で、エンティティを指定するんですが、これには以下のメソッドを使用します。
- ( void ) setEntity:( NSEntityDescription *) entity;

この引数として、「エンティティの指定」で紹介したメソッドの返り値を与える訳です。

ソート順序の指定には、以下のメソッドを使用します。
- ( void ) setSortDescriptors:( NSArray *) sortDescriptors;

これは、データベースから得られたデータ配列の順序を決めるために行いますが、複数の条件を設定できるように引数は配列で与えるようになっています。
今回は1つの条件のみでソートするので、要素数1の配列を作成しここへ渡します。
肝心のソートディスクリプタの作成には次のメソッドを使用します。
- ( id ) initWithKey:( NSString *) keyPath ascending:( BOOL ) ascending;

keyPath には、属性名を与えます。 2番目の引数は、昇順ソートなら YES、降順ソートなら NO を渡します。

受信要求の実行には、以下のメソッドを使用します。
- ( NSArray *) executeFetchRequest:( NSFetchRequest *) request error:( NSError **) error;

request には、作成した受信要求を与えます。2番目の引数は、以前にも登場したエラーオブジェクトへのポインタです。
このメソッドの返り値は要求の結果となっており、エラーが発生した場合は nil となります。

以上で、コーディングに必要なメソッドの紹介は終わりました。
一連のサンプルコードを以下に示します。
- ( NSMutableArray *) showData:( NSManagedObjectContext *) managedObjectContext {
NSMutableArray *results = nil;
if( managedObjectContext != nil ) {
  // ローカルDBから位置情報を取得
  NSFetchRequest *request = [[ NSFetchRequest alloc ] init ];
  NSEntityDescription *entity = [ NSEntityDescription entityForName: @"MyData" inManagedObjectContext: managedObjectContext ];
  [ request setEntity: entity ];
  // 値の大きい順に降順ソート
  NSSortDescriptor *sortDescriptor = [[ NSSortDescriptor alloc ] initWithKey: @"floatValue" ascending: NO ];
  NSArray *sortDescriptors = [[ NSArray alloc ] initWithObjects: sortDescriptor, nil ];
  [ request setSortDescriptors: sortDescriptors ];
  [ sortDescriptor release ];
  [ sortDescriptors release ];
  NSError *error;
  results = [[ managedObjectContext executeFetchRequest: request error: &error ] mutableCopy ];
  if( mutableFetchResults == nil ) {
   // エラー対処
  } else {
   [ results autorelease ];
  }
  [ request release ];
 }
return results;
}


.18 2009

CoreData について (4)

Tasaki です。

過去数回にわたって CoreData フレームワークの入門編をお送りしてきました。
これまでは使用前段階の準備についてご説明しましたが、ここからは実際の利用法について解説していきたいと思います。

まず、利用する場面として以下の状況が挙げられます。
・データの登録
・データの削除
・データの読み込み

今回はこのうちのデータの登録と削除の方法を見ていきます。

データの登録には、以下のメソッドを使用します。
+( id ) insertNewObjectForEntityForName:(NSString *) entityName inManagedObjectContext:(NSManagedObjectContext *) context;
1つ目の引数にはエンティティ名を、2つ目の引数には管理オブジェクトコンテキストを指定します。
また、このメソッドの返り値は管理オブジェクトクラスのインスタンスとなっており、このインスタンスに値を設定することで、データの仮登録を行います。

値の設定が完了したら、データベースにコミットします。
この操作によって、データの登録が完了します。
データベースへのコミットには、以下のメソッドを使用します。
- ( BOOL ) save:(NSError **) error;
引数はエラーオブジェクトのポインタを指定します。また、操作に成功すると YES が、失敗すると NO が返されます。失敗の時の原因となるエラーについては、引数から得ることができます。

最後に、この処理全体のサンプルコードを示します。
ここでは、前回までに作成した MyData エンティティ及び管理オブジェクトクラスを使用しています。
- ( BOOL ) addData {
 MyData *aDataObject = ( MyData *)[ NSEntityDescription insertNewObjectForEntityForName: @"MyData" inManagedObjectContext: managedObjectContext ];
 if( aDataObject == nil ) {
  return NO;
 }
// 属性をセット
 [ aDataObject setFloatValue: 2.0201f ]];
 [ aDataObject setName: @"OS version" ];
// 変更をコミット
NSError *error = nil;
 if([ managedObjectContext save: &error ] == NO ) {
  // エラー対処
  return NO;
 }
return YES;
}


データを削除する場合には、以下のメソッドを使用します。
- ( void ) deleteObject:( NSManagedObject *) object;
引数には削除したい管理オブジェクトを渡します。
登録時と同様、データベースから削除する場合は、メソッド呼び出し後にコミットする必要があります。なお、このメソッドのレシーバは管理オブジェクトコンテキストとなっています。


.15 2009

CoreData について (3)

Tasaki です。

今回はデータモデルファイルとエンティティの作成について解説していきます。

まず、データモデルファイルを作成します。
新規ファイル作成テンプレートの Cocoa カテゴリに「データモデル」という項目がありますので、これを選択します。
DataModelTemplate.png
適当なファイル名を付けて保存します。
ここでは、MyData.xcdatamodel としておきます。
その次の画面はとりあえず何もせずに完了します。


その後、作成したファイルを開くと、専用の編集画面が表示されます。
以下はその一部です。

EditDataModel.png

左上のエンティティテーブルの下部にある+ボタンを押すと、エンティティが追加されます。
作成したエンティティを選択して名前を付けます。ここでは、MyData としておきます。
さらに右側のペインから、右端のアイコンを選択し、エンティティに対応するクラスの名前をデータクラスのテキストフィールドへ入力します。
ここでは、エンティティ名と同じ MyData とします。

エンティティを選択した段階で、右隣のテーブル下部の+が選択できるようになっているので、これを押すといくつか項目が表示されます。
ここはひとまず、floatValue と name という属性を作成してみます。
属性を追加すると、名前やデータ型を指定できるようになっていますので、それぞれ浮動小数点と文字列型として定義します。デフォルト値や入力情報の制限などもここで設定できるようです。

EditAttribute.png

これで、ファイルとエンティティの作成まで完了しました。
あとは、プログラム内部でエンティティと対応するクラスを作成します。
データモデルファイルの編集画面を開いている状態で、新規ファイル作成テンプレートを開くと管理オブジェクトクラスという項目が増えていますので、これを選択します。

ManagedObjectTemplate.png

この後、ファイルの保存先を指定し次の画面に進むと、リスト中に MyData が表示されていると思いますので、そのまま完了します。
すると、自動的に管理オブジェクトクラスのヘッダおよびソースファイルが作成されます。
この方法は、自力でコードを書かずに済むので大変便利です。


これで、準備は完了です。
次回はデータベースの読み込みと保存の方法についてご紹介したいと思います。

.14 2009

CoreData について (2)

Tasaki です。

前回、データベース使用に際して必要な準備をざっとご紹介しましたので、今回はそれらを1つずつ具体的に見ていきたいと思います。

今回は、管理オブジェクトモデル、永続ストアコーディネータ、管理オブジェクトコンテキストの作成について採りあげようと思います。
これらのうち、最も頻繁に目にすることになるのは最後に挙げた管理オブジェクトコンテキストでしょう。
残りの2つは、この管理オブジェクトコンテキストを作成する際に必要になもの、と考えておいてよさそうです。

それでは、具体的なコード例を以下に示します。
まず、いずれかのクラスにそれぞれのインスタンス変数を定義します。

// インタフェース部
NSManagedObjectModel *managedObjectModel;
NSPersistentStoreCoordinator *persistentStoreCoordinator;
NSManagedObjectContext *managedObjectContext;

@property ( nonatomic, retain, readonly ) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property ( nonatomic, retain, readonly ) NSManagedObjectModel *managedObjectModel;
@property ( nonatomic, retain, readonly ) NSManagedObjectContext *managedObjectContext;

ここでは、それぞれのゲッタで初期化を行うようにしています。
なお、データベースは SQLite を使用するため、MyManagedData.sqlite というファイルを呼び出しています。
パスは、./data です。

// 管理オブジェクトモデルのゲッタメソッド
- ( NSManagedObjectModel *) managedObjectModel {
 if( managedObjectModel == nil ) {
  managedObjectModel = [[ NSManagedObjectModel mergedModelFromBundles: nil ] retain ];
 }
return managedObjectModel;
}

// 永続ストアコーディネータのゲッタメソッド
- ( NSPersistentStoreCoordinator *) persistentStoreCoordinator {
 if( persistentStoreCoordinator == nil ) {
  NSString *documentsDirectory = @"./data";
  persistentStoreCoordinator = [[ NSPersistentStoreCoordinator alloc ] initWithManagedObjectModel:[ self managedObjectModel ]];

  NSError *error = nil;
  NSURL *storeURL = [ NSURL fileURLWithPath:[ documentsDirectory stringByAppendingPathComponent: @"MyManagedData.sqlite" ]];
  [ persistentStoreCoordinator addPersistentStoreWithType: NSSQLiteStoreType configuration: nil URL: storeURL options: nil error: &error ];
  if( error != nil ) {
   // エラー処理
  }
 }
return persistentStoreCoordinator;
}

// 管理オブジェクトコンテキストのゲッタメソッド
- ( NSManagedObjectContext *) managedObjectContext {
 if( managedObjectContext == nil ) {
  NSPersistentStoreCoordinator *coordinator = [ self persistentStoreCoordinator ];
  if( coordinator != nil ) {
   managedObjectContext = [[ NSManagedObjectContext alloc ] init ];
   [ managedObjectContext setPersistentStoreCoordinator: coordinator ];
  }
 }
return managedObjectContext;
}

ここでは、エンティティを1つだけしか扱っていませんが、永続ストアコーディネータの addPersistentStoreType:configuration:URL:options:error: メソッドを呼んでファイルを追加していくだけで、簡単に複数のエンティティを扱えます。

残りの準備については、次回ご紹介する予定です。


.13 2009

CoreData について (1)

Tasaki です。

前回お話ししたように、これから数回にかけて CoreData フレームワークの簡単な使い方をご紹介したいと思います。

まず初めに、CoreData フレームワークを使うことで何ができるのか、という点についてですが、プログラム内部のデータと同じような操作でデータベースとやり取りができます。
要は、SQL文をコードに書き込まずに済むようになります。
他にも利点はあるみたいですけど、ひとまずこの点に着目して、SQL文を書かずにデータベースを扱うところまでを目指したいと思います。

そのためには、以下のような準備が必要となってきます。
・管理オブジェクトモデルの作成
・永続ストアコーディネータの作成
・管理オブジェクトコンテキストの作成
・データモデルファイルの作成
・エンティティの定義
・エンティティに対応するクラスの作成。

一見すると面倒なような気がしますが、自前でやるよりは簡単だと思います。
詳しくは次回以降ということで。


.12 2009

CoreData 勉強中…

Tasaki です。

今日も引き続き、3.0 のテストをやってました。
微妙に変わっているところから、ガラリとイメージチェンジしたところまでいろいろでしたね。
詳しいことが書けないのが残念ですけど、シミュレータでもある程度は再現されてるみたいです。

で、今日はまあ技術情報として紹介できるようなレベルには至らなかったのですが、CoreDataという Mac 用のフレームワークについて勉強しておりました。
このフレームワークはデータベースの利用を簡単にするためのもので、これを使えばアンドゥ、リドゥなんかも結構簡単に実装できるみたいです。

iPhone 開発で初めて Mac を触ったという僕のような方は、ぜひこのフレームワークの使い方を修得することをお勧めします。その理由は………この先きっと役に立つから、です。

まあ、そういうわけで次回以降はその辺りをテーマにしてやっていこうと思います。

また、「ここが知りたい」というリクエストがありましたら、コメント欄にでもお寄せください。僕で分かる範囲で(というとかなり限られてしまいますけど)お応えしたいと思います。


.11 2009

3.0であの裏技が封印されてしまいました

Tasaki です。

まず初めに弊社製品をお買い上げくださった皆様、本当に有難うございます!
できるだけご要望にお応えしていきたいと思いますので、neo@next-ststem.comまでご意見をお寄せください。
また午前中申し上げました通り、ブログ保守作業中に誤って全てのコメントを削除してしまいました。
コメントをお寄せくださった方々には本当に申し訳なく思っております。
改めてお詫び致します。すみませんでした。

では、今回の表題の件に関しまして、
本日実機に OS3.0β5 をインストールし、2.2.1 で開発していたアプリのテストを行っていたんですが、その中で以前紹介したアプリの再起動テクニックが使えなくなっていたので報告させていただきます。

これを3.0で試すとどうなるか…は、シミュレータでも同じ現象が起こるようですので、確認してみて下さい。

結論としては、ああやっぱりバグだったんだな、というところでしょうか。

そもそも、バックグラウンドで動いてくれれば、こんなややこしいことする必要もないんですけどね。
ガイドラインを見る限り、こればっかりは覆りそうもありませんが。

.11 2009

コメント削除のお詫び

Tasaki です。

コメントをお寄せくださった皆様、
いつも当ブログをご覧頂きありがとうございます。

大変申し上げにくいのですが、本日、ブログの保守作業中に誤って全てのコメントを削除してしまいました。
本当に申し訳ありません。

今後は、再発防止に全力を尽くしますので、何とぞご容赦ください。

また、引き続き当ブログをご利用頂けますようお願い申し上げます。


 HOME 

ブログ内検索

関連リンク

製品情報

最新記事

カテゴリ

プロフィール

neoxneo



NEXT-SYSTEM iOS Developers Blog


  • UTO:
    カナダ版iPhone4Sは、マナーモードでシャッター音がならない…


  • Ehara:
    ...


  • Hayate:
    ...


  • Tasaki:
    Developer登録完了...したのはいいけど


  • Ueda:
    ...



リンク

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