スタンフォード大学のiPhoneアプリ開発講座の宿題(Presence 3)

Presence 3の主な課題はPresence 2を改良する事で、具体的にはTwitterから情報を取得してくる処理等をマルチスレッド化して、情報取得中にアプリケーションがフリーズしないようにするという物である。また、Twitterにつぶやきを投稿できるようにするというのも、もう一つの大きな課題である。ここまで実装することで、とりあえずTwitterアプリとしての最低限の機能を備えたという感じだ。

Presence 2と同様に、本課題の回答も以下のseiji blogブログで非常に明解に説明されているので、本ブログでは一部追加課題のコードのみ触れる事にする。


1. Twitterのフレンド情報をplistではなく、Twitterのサーバから取得するようにする。
スタンフォード大から提供されているTwitterHelperクラスに新たにメソッドを追加
する事になるのだが、以下のようなメソッドを追加し、このメソッドを呼ぶ事で
Twitterのサーバからフレンド情報を取って来る事が出来る。

+ (NSArray *)fetchFriends:(NSString *)username {
    NSString *urlString =
        [NSString stringWithFormat:@"http://%@/statuses/friends/%@.json",
                    [self twitterHostnameForUsername:username], username];
    NSURL *url = [NSURL URLWithString:urlString];
    return [self fetchJSONValueForURL:url];
}


2. Twitterのつぶやきを規定どおりの140字以内に制限するようにし、残り何文字入力出来るか表示する。
Twitterのつぶやきを送信するためのStatusComposeViewControllerにUITextFieldDelegateを実装することで、ユーザのテキスト入力をキャッチする事が出きるようになる。
参考ブログ:UITextFieldで文字数制限をする : X(ペケ)code Programming

#define MAX_IMPUT_CHARACTERS 140

- (BOOL)textField:(UITextField *)textField
    shouldChangeCharactersInRange:(NSRange)range
    replacementString:(NSString *)string {
    int numOfCharacters = range.location + [string length];
    
    BOOL rtn = YES;
    if (numOfCharacters < MAX_IMPUT_CHARACTERS) {
        rtn = YES;
    } else {
        rtn = NO;
    }
    
    // Display how many characters a user can input.
    numCharLabel.text = [NSString stringWithFormat:@"%d",
                        MAX_IMPUT_CHARACTERS - numOfCharacters];
    
    return rtn;
}


3. Objective-Cソースコード静的チェックツールClang Static Analyzerを動作させてみる。
講義で紹介されたClang Static Analyzerを実際に動かして見るという課題だが、インストールして実行してみると以下のようなエラーが出た。

This produced the dreaded
Checking Dependencies...
** BUILD SUCCEEDED **
scan-build: Removing directory
'/var/folders/Ck/Cklnad2tHayb4iUB6fuC0U+++TQ/-Tmp-/scan-build-2009-05-10-1'
because it contains no reports. 

そこで、http://www.fruitstandsoftware.com/blog/2008/08/finding-memory-leaks-with-the-llvmclang-static-analyzer/に書かれてある設定を実施すると、上手く動作するようになった。


以下は私が作成したTwitterのつぶやき投稿画面。