Objective-C UILabelをperformSelectorInBackgroundで連続で操作すると落ちる

UIProgressViewで進捗を表示すると同時に、
UILabelで%を表示しようと思い、performSelectorInBackgroundで書き換えるコードを書いたところ、
10回に1回ぐらいの割合で落ちた。

エラーメッセージや頻度もまちまちなため、
恐らく複数のスレッドで同時にUILabelにアクセスしようとして落ちたのではと思い、
KAThreadを使わせて頂き、
常に同じスレッドで更新するようにしたところ落ちなくなった。

KAThreadはこちら

Objective-C iPhoneアプリでmp3などの音楽をWebのURLを指定して再生する

音楽データをWebから取得して再生するのをやりたくていろいろやり方を調べた結果をまとめておきます。

AVAudioPlayerを使うと、
サーバ上のURLを指定して音楽データをWeb上から取得して再生が出来ます。

AVAssetやAVMetadataItemを使い、
mp3のメタデータやアートワークも取得ができます。

[objc]
NSError *error;
NSData *data = [[NSData alloc] initWithContentsOfURL:url];
AVAudioPlayer *_audioPlayer = [[AVAudioPlayer alloc] initWithData:data error:&error];

if( error ){
NSLog(@"%@", error);
return;
}

AVAsset *asset = [AVURLAsset URLAssetWithURL:url options:nil];
NSArray *metadata = [asset commonMetadata];

for ( AVMetadataItem *item in metadata ) {
if( [[item commonKey] isEqualToString:@"title"] ){
_currentPlayingTitle = [item stringValue];
}
if( [[item commonKey] isEqualToString:@"artist"] ){
_currentPlayingArtist = [item stringValue];
}
if ([[item commonKey] isEqualToString:@"artwork"]) {
UIImage *img = nil;
if ([item.keySpace isEqualToString:AVMetadataKeySpaceiTunes]) {
img = [UIImage imageWithData:[item.value copyWithZone:nil]];
}
else { // if ([item.keySpace isEqualToString:AVMetadataKeySpaceID3]) {
NSData *data = [(NSDictionary *)[item value] objectForKey:@"data"];
img = [UIImage imageWithData:data] ;
}
_currentPlayingArtwork = img;
}
}

[_audioPlayer prepareToPlay];
[/objc]

Effective Objective-C

今読んでいる本です。
この本を買ってから
Effetiveシリーズは良書が多いということを知り、実際に勉強になってます。

ある程度アプリを作れるようになってくると、
より良いコードを書くには他の人のソースから学ぶ必要が出てきますが、
できればどういう考えで書いてるかなどをきちんと言葉で知りたいというのは常々出てきます。

書籍の中では例えば、
今まで
#define MyWifeCount 30としていたところを
static int MyWifeCount 30と書くと、
動作的には同じですが、#defineだと型が不明なため、後者の書き方をするとより定数の意図がはっきりするといったことなどがあり、
仕事の中でちょくちょく仕入れた知識を使っていくと良いコードが習慣化されていくと思っております。

正直どんなコードを書いてもユーザには分からないですが、
こだわって書いた方が楽しかったりします。