2012-05-13
■[IT]バックグラウンドスレッドでUITableViewを更新する
重い検索処理をバックグラウンドスレッドで実行して、その結果をUITableViewに反映させようとしてはまった。
最初は以下のようにしていたが、これは間違い。
- (void)searchStocks:(id)param{ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; while (TRUE) { if (self.thread.isCancelled) { break; } if (self.keyWords != nil) { StockSearchCriteria *criteria = [[StockSearchCriteria alloc] initWithKeyWords:self.keyWords]; self.stockSearchPopoverController.tableViewController.stocks = [StockContainer findByCriteria:criteria]; [self.stockSearchPopoverController.tableViewController.tableView reloadData]; [self.stockSearchPopoverController.tableViewController.tableView performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:NO ]; self.keyWords = nil; } } [pool release]; }
正しくは以下。
- (void)searchStocks:(id)param{ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; while (TRUE) { if (self.thread.isCancelled) { break; } if (self.keyWords != nil) { StockSearchCriteria *criteria = [[StockSearchCriteria alloc] initWithKeyWords:self.keyWords]; self.stockSearchPopoverController.tableViewController.stocks = [StockContainer findByCriteria:criteria]; [self.stockSearchPopoverController.tableViewController.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO ]; self.keyWords = nil; } } [pool release]; }
ポイントは以下。
・UITableViewのreloadDataはメインスレッドで実行しないといけない。そうしないとtableView:cellForRowAtIndexPathが実行されない。
・reloadDataを実行したらsetNeedsDisplayも実行されるっぽい。
2012-05-12
2012-05-11
■[IT]ObjectiveーCで正規表現
下記のようにやるらしい。後方参照とかどうやるんだろ。
NSString *string = @"1日3食のうち4食はうどんを食べたいと思っている。"; NSRange match = [string rangeOfString:@"[0-9]+食" options:NSRegularExpressionSearch]; if (match.location != NSNotFound) { NSLog(@"Found: %@",[string substringWithRange:match]); } else { NSLog(@"Not Found"); }
下記サイトを参考にしました。
2012-05-10
■[IT]ObjectiveーCで文字列検索
上記サイトによるとlikeのときは括ってはいけないと書いてあるが、やってみたらくくらないとエラーになった。
NSPredicate *predLike = [NSPredicate predicateWithFormat:@"name like[c] '%@'", name]; NSPredicate *predContains = [NSPredicate predicateWithFormat:@"name contains[c] '%@'", name];
LIKEで検索する場合は*をワイルドカードとしてつかえる。
CONTAINSは部分一致。




