0

これは私の問題です。サーバーから返される JSON を使用して iOS を構築しています。問題はありません。すべて正常に動作します。

問題は、プログラムを実行すると、結果を解析するのに長い時間がかかることNSMutableArrayです:これはログです

2013-01-10 12:03:48.627 project[5917:907] <- time begin parser
2013-01-10 12:03:48.755 project[5917:907] <- time finish parser
2013-01-10 12:03:48.756 project[5917:907] <- time begin implement arrays
2013-01-10 12:03:58.522 project[5917:907] <- time finish implement array

ご覧のとおり、配列の実装には非常に時間がかかります。

UI をレスポンシブにするには、キューイングとグランド セントラル ディスパッチを使用する必要があることはわかっていますが、その方法がわかりません。その方法を教えてください。

これが私のviewDidLoad方法です

- (void)viewDidLoad
{
    [super viewDidLoad];

    if debug
        NSLog(@"<- time begin parser");
    endif


    NSString *URLStr = @"http://myJsonFile.json";

    NSDictionary *myDictwithReturn = [TOCJSONParser awesomeParserWithStringOfYourJSONFile:URLStr]; //really cool parser, i can put it on gitHub if you want
    NSArray *speakersArray = [myDictwithReturn objectForKey:@"speakers"];

    myArray = [[NSMutableArray alloc]init];

    NSLog(@"<- time finish parser");
    NSLog(@"<- time begin implement arrays");

    for (NSDictionary *myDict in speakersArray) {

        _nextSpeaker = [[TOCSpk alloc]init];
        [_nextSpeaker setName:[myDict objectForKey:@"name"]];
        [_nextSpeaker setBusiness:[myDict objectForKey:@"business"]];
        [_nextSpeaker setDesc:[myDict objectForKey:@"desc"]];
        [_nextSpeaker setTwitter:[NSURL URLWithString:[myDict objectForKey:@"twitter"]]];
        [_nextSpeaker setPicture:[_nextSpeaker retrieveImageFromServer:[myDict objectForKey:@"picture"]]];
        [myArray addObject:_nextSpeaker];
    }

    NSLog(@"<- time finish implement array"); 
}
4

1 に答える 1

2

速度が遅いのは を呼び出しretrieveImageFromServerているためだと思われます。これにより、ネットワークにアクセスしていると思われます。同じステートメントでイメージを割り当てているという事実から見えるように、そのアクセスが同期的である場合、これは遅くなるはずです。

コードを見直して、別のスレッドで実行するか、非同期ネットワーク アクセスを使用する必要があります。

編集:

の使用に関するあなたのコメントの後dataWithContentsOfURL、私の上記の仮説が確認されました。イメージを非同期的にダウンロードする方法については、この SO 投稿を参照するか、利用可能なさまざまなネットワーク フレームワークのいずれかを使用することができます。

おそらく、最も簡単な方法は、画像の非同期ダウンロードを提供するクラスであるSDWebImageを使用することです。そのため、スレッド管理やNSURLConnection:

UIImageView+WebCache.h ヘッダーを #import して、setImageWithURL:placeholderImage:メソッドからメソッドを呼び出すだけtableView:cellForRowAtIndexPath: UITableViewDataSourceです。非同期ダウンロードからキャッシュ管理まで、すべてが処理されます。

于 2013-01-10T11:38:51.147 に答える