(objective-c)指定したパスの中身を調べる
英語が苦手な私は、ディレクトリの中のファイルを返してくれるメソッドが
NSFaileManagerにあるという事を知っていながらも、何かわからなくてググるという事になりました。
とても久しぶりの書き込みですが、内容はとても簡単なものです。
最近作るアプリは InAppPurchase(スペルあってるのかな・・・。)を使う事が多く、
その為ファイルをダウンロードして、その管理とかをする事が多くなると思うので、
色々準備をしておこうと思いました。
そこで、ファイルをダウンロードしていた途中にネットワークが切れた時など、
ファイルのダウンロードが途中で切れたファイルの場合は削除してやり直したいと思いました。
そこでまずディレクトリーに何が入っているかを調べようと思います。
NSFileManager* filemanager = [[NSFileManager alloc] init];
NSError* error = nil;
NSArray* ar = [filemanager contentsOfDirectoryAtPath: @"directoryのpath"
error: &error];
このarにファイルの名前がNSString*の配列になって返ってきます。
ただし、サブディレクトリーまで調べたいときは
- (NSArray *)subpathsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;
を利用しましょう。
ファイルマネージャのヘッダーにはこう書かれています。
/* contentsOfDirectoryAtPath:error: returns an NSArray of NSStrings representing the filenames of the items in the directory. If this method returns 'nil', an NSError will be returned by reference in the 'error' parameter. If the directory contains no items, this method will return the empty array.
This method replaces directoryContentsAtPath:
*/
- (NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error NS_AVAILABLE(10_5, 2_0);
/* subpathsOfDirectoryAtPath:error: returns an NSArray of NSStrings represeting the filenames of the items in the specified directory and all its subdirectories recursively. If this method returns 'nil', an NSError will be returned by reference in the 'error' parameter. If the directory contains no items, this method will return the empty array.
This method replaces subpathsAtPath:
*/
- (NSArray *)subpathsOfDirectoryAtPath:(NSString *)path error:(NSError **)error NS_AVAILABLE(10_5, 2_0);
最近忙しくて、プログラムを作る事だけに精一杯であまり勉強も出来ずにただただソースを書いている毎日ですが、ゆっくり色々デザインパターンを調べたりしながら勉強したいものです。
NSFaileManagerにあるという事を知っていながらも、何かわからなくてググるという事になりました。
とても久しぶりの書き込みですが、内容はとても簡単なものです。
最近作るアプリは InAppPurchase(スペルあってるのかな・・・。)を使う事が多く、
その為ファイルをダウンロードして、その管理とかをする事が多くなると思うので、
色々準備をしておこうと思いました。
そこで、ファイルをダウンロードしていた途中にネットワークが切れた時など、
ファイルのダウンロードが途中で切れたファイルの場合は削除してやり直したいと思いました。
そこでまずディレクトリーに何が入っているかを調べようと思います。
NSFileManager* filemanager = [[NSFileManager alloc] init];
NSError* error = nil;
NSArray* ar = [filemanager contentsOfDirectoryAtPath: @"directoryのpath"
error: &error];
このarにファイルの名前がNSString*の配列になって返ってきます。
ただし、サブディレクトリーまで調べたいときは
- (NSArray *)subpathsOfDirectoryAtPath:(NSString *)path error:(NSError **)error;
を利用しましょう。
ファイルマネージャのヘッダーにはこう書かれています。
/* contentsOfDirectoryAtPath:error: returns an NSArray of NSStrings representing the filenames of the items in the directory. If this method returns 'nil', an NSError will be returned by reference in the 'error' parameter. If the directory contains no items, this method will return the empty array.
This method replaces directoryContentsAtPath:
*/
- (NSArray *)contentsOfDirectoryAtPath:(NSString *)path error:(NSError **)error NS_AVAILABLE(10_5, 2_0);
/* subpathsOfDirectoryAtPath:error: returns an NSArray of NSStrings represeting the filenames of the items in the specified directory and all its subdirectories recursively. If this method returns 'nil', an NSError will be returned by reference in the 'error' parameter. If the directory contains no items, this method will return the empty array.
This method replaces subpathsAtPath:
*/
- (NSArray *)subpathsOfDirectoryAtPath:(NSString *)path error:(NSError **)error NS_AVAILABLE(10_5, 2_0);
最近忙しくて、プログラムを作る事だけに精一杯であまり勉強も出来ずにただただソースを書いている毎日ですが、ゆっくり色々デザインパターンを調べたりしながら勉強したいものです。
NSMutableArrayのソート
最近忙しい・・・という事で、アメーバをやってなかったけれども、
最近よく使うようになったNSArrayのメソッドを一つ紹介します。
NSMutableArray がもっている
- (void)sortUsingFunction:(NSInteger (*)(id, id, void *))compare context:(void *)context;
というメソッドです。
NSArray だと
- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator context:(void *)context;
でソートされた配列が戻ってきます。
ま、これ以外にも
NSArray
- (NSArray *)sortedArrayUsingSelector:(SEL)comparator; //セレクターを使うのかな?
- (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr NS_AVAILABLE(10_6, 4_0);
NSMutableArray
- (void)sortUsingComparator:(NSComparator)cmptr NS_AVAILABLE(10_6, 4_0);
さっと見てこんな物もありましたが、今回は
- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator context:(void *)context;
について書いてみようと思います。
http://d.hatena.ne.jp/jjj777/00040420
このサイトに載っている説明文を借りると
「変更可能な配列を比較関数でソートします。
比較関数は2つのエレメントを比較するために使います。最初のエレメントの方が2番目のエレメントよりも小さいときは NSOrderedAscending を返し、大きい時は NSOrderedDescending を返します。2つのエレメントが同じ場合は NSOrderedSame を返します。
第3の引数として毎回contextが渡されます、比較関数のパラメータとして使うことができます。」
と書いてあります。」
自分はこの比較関数のパラメータとして使えるというcontextの使い方がいまいちわかりませんが・・・・。
普通に値を比較する時には使わないみたいで、サンプルコードとかすググるとほとんどがnilを渡していました。
今度わかったらまた投稿します。
んで、実際の使い方です。
まずはどのように比較するかの関数です
NSComparisonResult listCompare (id obj1, id obj2, void* context)
{
//自分が比較したいオブジェクトに変換
MyObj* my = obj1;
MyObj* target = obj2;
//値を比較して(ここではvalueという物)それに当たる物を返す。
if (my.value < my.value)
return NSOrderedAscending;
else if (my.value == my.value)
return NSOrderedSame;
else
return NSOrderedDescending;
}
これで比較関数は完成です。
これを使ってNSMutableArrayをソートさせてみます。
NSMutableArray* list = [[NSMutableArray alloc] init];
//listに要素がセットされているとします。
[list sortUsingFunction: listCompare
context: nil];
//この1行で配列がソートされます。
簡単ですね。笑
最近よく使うようになったNSArrayのメソッドを一つ紹介します。
NSMutableArray がもっている
- (void)sortUsingFunction:(NSInteger (*)(id, id, void *))compare context:(void *)context;
というメソッドです。
NSArray だと
- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator context:(void *)context;
でソートされた配列が戻ってきます。
ま、これ以外にも
NSArray
- (NSArray *)sortedArrayUsingSelector:(SEL)comparator; //セレクターを使うのかな?
- (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr NS_AVAILABLE(10_6, 4_0);
NSMutableArray
- (void)sortUsingComparator:(NSComparator)cmptr NS_AVAILABLE(10_6, 4_0);
さっと見てこんな物もありましたが、今回は
- (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id, id, void *))comparator context:(void *)context;
について書いてみようと思います。
http://d.hatena.ne.jp/jjj777/00040420
このサイトに載っている説明文を借りると
「変更可能な配列を比較関数でソートします。
比較関数は2つのエレメントを比較するために使います。最初のエレメントの方が2番目のエレメントよりも小さいときは NSOrderedAscending を返し、大きい時は NSOrderedDescending を返します。2つのエレメントが同じ場合は NSOrderedSame を返します。
第3の引数として毎回contextが渡されます、比較関数のパラメータとして使うことができます。」
と書いてあります。」
自分はこの比較関数のパラメータとして使えるというcontextの使い方がいまいちわかりませんが・・・・。
普通に値を比較する時には使わないみたいで、サンプルコードとかすググるとほとんどがnilを渡していました。
今度わかったらまた投稿します。
んで、実際の使い方です。
まずはどのように比較するかの関数です
NSComparisonResult listCompare (id obj1, id obj2, void* context)
{
//自分が比較したいオブジェクトに変換
MyObj* my = obj1;
MyObj* target = obj2;
//値を比較して(ここではvalueという物)それに当たる物を返す。
if (my.value < my.value)
return NSOrderedAscending;
else if (my.value == my.value)
return NSOrderedSame;
else
return NSOrderedDescending;
}
これで比較関数は完成です。
これを使ってNSMutableArrayをソートさせてみます。
NSMutableArray* list = [[NSMutableArray alloc] init];
//listに要素がセットされているとします。
[list sortUsingFunction: listCompare
context: nil];
//この1行で配列がソートされます。
簡単ですね。笑
duduplicate symbol _OBJC_IVAR_ エラーの原因
duduplicate symbol _OBJC_IVAR_
というエラーが出てくる時があったら、
別のヘッダーで同じオブジェクトを宣言していないか(同じクラス名を持った物)確認するベキ。
というエラーが出てくる時があったら、
別のヘッダーで同じオブジェクトを宣言していないか(同じクラス名を持った物)確認するベキ。