-1

JSON データを返す URL の配列のデータを取得したいと考えています。私は次のコードを試しています:

for (int i =0; i<numberOfDays; i++)
{
    NSData *data = [NSData dataWithContentsOfURL:[wordURLs objectAtIndex:i]];
    NSLog(@"%@",[wordURLs objectAtIndex: i]);
    [self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:YES];
}

「wordURLs」は URL の配列であり、「fetchedData:」メソッドで、返された JSON データを plist ファイルに保存します。

問題は、ループが実行されるすべての回数で、データが 1 つまたは 2 つの特定の URL (つまり、インデックス 1 と 3、または 1 と 2 など) の URL に対してのみ返されることです。ログに記録すると、「データ」変数が初期化されるたびに URL が異なることがわかります。

これを行うより良い方法は何ですか?

JSON の解析に NSJSONSerialization を使用しました。

4

1 に答える 1

2

これを行うには、もっと良い方法があります。あなたがやろうとしていることの問題は、それが同期的であることです。つまり、アプリはこのアクションが完了するまで待ってから、他のことを行う必要があります。NSURLConnectionandを使用してこれを非同期呼び出しにし、NSURLRequestsデリゲートを設定することを検討することをお勧めします。

セットアップと管理が比較的簡単で、アプリの実行が何百万倍もスムーズになります。

家に帰ったら、少し後でこれを行うためのサンプルコードを投稿します。

アップデート

まず、これらの接続を呼び出すクラスは、インターフェイス ファイル内の接続のデリゲートである必要があります。たとえば、次のようになります。

ViewController.h

@interface ViewController: UIViewController <NSURLConnectionDelegate, NSURLConnectionDataDelegate> {
    NSMutableData *pageData;
    NSURLConnection *pageConnection;
}

次に、実装で必要な変数を作成/初期化する必要があります

ViewController.m

-(void) viewDidLoad {
       pageData = [[NSMutableData alloc] init];
       NSURLRequest *pageRequest= [[NSURLRequest alloc] initWithURL:pageURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:4];
       pageConnection = [[NSURLConnection alloc] initWithRequest:pageRequestdelegate:self];
}

次に、データが取得されるときに呼び出されるデリゲート関数も必要です。

-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    if (connection == pageConnection) {
        [pageData appendData:data];
    }
}

-(void) connectionDidFinishLoading:(NSURLConnection *)connection {
    if (connection == pageConnection) {
        // Do whatever you need to do with the data
    }
}

-(void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {

    if (connection == pageConnection) {
        // Do something since the connection failed
    }
}

もちろん、この例では読み込まれる URL は 1 つだけですが、必要な数の URL を作成できます。NSURLConnectionsもちろん、受信したデータをどこに置くべきか、失敗した場合や接続が正常に完了した場合にどのようなアクションを取るべきかを知るために、必要なものすべてを追跡する必要がありますが、それは難しい拡張ではありません私が与えたものから。

明らかなエラーや何かが機能しない場合は、お知らせください。

于 2013-07-08T18:01:24.913 に答える