2

これはできるだけ短くするようにします。Webからの画像を保存できる必要があるiPhone用のアプリを作成しています。画像のURL(他のデータの中でも)は、MySQLサーバーの1つのテーブルに保存されます。そこから、JSONを使用してテーブルを解析し、これを正常にシリアル化して、アプリのUITableViewに表示しました。各セルには、テーブルのimageurl-fieldの画像と、テーブルのtitle-fieldの画像のタイトルが、MySQL-> json.php-> NSArray(json)(objectAtIndex)の両方から表示されます。等

この時点で、アプリが起動するたびに、JSON.phpを使用してURLからすべての情報を取得し、画像も毎回ダウンロードすると思います。これは必要以上の作業だと思いますが、データベースはデータの取得場所に応じて不規則に更新されるため、情報を一度ダウンロードするだけでは不十分です。

質問1:JSONが示すのとまったく同じデータがある場合、アプリが.phpを「要求」するソリューションが必要です。私が考えることができる最も論理的な方法は、.phpに「日付」のフィールドを追加して、データが最後に更新された日付を示すことです。アプリに同じ日付のデータがある場合は何も起こりませんが、php-サイド日付がアプリサイド日付よりも新しい場合は、保存されているすべてのデータを削除して、新しいJSONデータに置き換えることができる必要があります。

質問2:JSONデータはiPhoneのNSArrayであり、「画像」のフィールドは画像のURL(www.example.com/image.png)であり、実際の画像ではありません。これらの画像をダウンロードして、JSONを介してデータの新しい「バージョン」が利用可能になるまでiPhoneに保存するにはどうすればよいですか?

ボーナスの質問:私が現在使用している方法は、スクロールするとUITableViewが遅れることです。私はプロではありませんが、これはメモリリークが原因である可能性があることをいくつか読んだことがあり、これが何を意味するのか完全には理解していません。また、1回ではなく、すべてのセルのオブジェクトをインスタンス化して再利用することが原因である可能性があることも読みました。

結論:私の目標は、アプリが最初のアプリの起動時にjson.phpからすべてのデータをダウンロードし、その後の起動時にバージョンが正しいかどうかを確認することです。正しければ、ダウンロードは必要ありません。データを含む保存されたJSONオブジェクトを使用するだけで、URLからの画像ファイルが最初の起動でダウンロードされます。正しくない場合は、以前に保存されたすべての画像を削除し、json-objectをクリアして、新しく更新されたjson-objectをインポートし、iPhoneのどこかにあるjsonobjectのimage-urlsから画像を保存します。

注:データを更新する(つまり、行われたすべての変更である1つの画像を追加する)ことは解決策ではなく、ここでの私の目には可能性がありません。このデータベースに更新があった場合、電話に保存されているすべての情報を消去して、すべてを再ダウンロードする必要があります。これは、データベースに入れた情報が別のWebサイトから解析され、新しい画像またはデータの更新に他のフィールドの変更が含まれている場合は、データベースを調整して(json.phpを介して)適合させるためです。アプリのアップデートを常にリリースするよりも。

これは間違ったアプローチですか?これは可能ですか?ヘルプは大歓迎です!

JSONを編集します-あちこちからのもの..

#define kURL [NSURL URLWithString:@"www.example.com"] 

NSData* data = [NSData dataWithContentsOfURL: kURL]; 
NSArray *json = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: &e]; 
NSDictionary *info = [json objectAtIndex:indexPath.row]; 
cell.textLabel.text = [info objectForKey:@"Name"]; // ±Same for url

これはクラス内のさまざまな場所から抽出されるため、このように正確に機能しない可能性があります。

編集

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}



// Configure the cell...

info = [json objectAtIndex:indexPath.row];

cell.textLabel.text = [info objectForKey:@"Name"];


NSString* imageURL = [info objectForKey:@"Image"];
NSURL *URLimage = [NSURL URLWithString:imageURL];
NSData* imageData = [NSData dataWithContentsOfURL:URLimage];
UIImage* images = [[UIImage alloc] initWithData:imageData];
cell.imageView.image = images;




return cell;

}

スティアン。

4

2 に答える 2

0

誰かがこれを読んだ場合に備えて..たとえば、大きなJSONファイルをフェッチ(および解析)するためにNSURLを作成する場合。これはバックグラウンドで実行する必要があります(dispatch_get_global_queue)。次に、データが必要なときに呼び出します(dispatch_async)。それ以外の場合は、UIと同じスレッドを使用しており、タスクの実行中にフリーズします。

#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
#define JSONURL [NSURL URLWithString:@"http://www.web.com/json.php"]    
...

dispatch_async(kBgQueue, ^{
    NSData* data = [NSData dataWithContentsOfURL:JSONURL];
    [self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:YES];
});
于 2012-10-30T17:21:50.447 に答える
0

NSURLRequest を介してサーバーと通信していると思います。その場合は、キャッシュ ポリシーを NSURLRequestReloadRevalidatingCacheData に設定するだけで、データが既にキャッシュにあり、最新の状態であれば再ダウンロードされません。このようにして、ほとんどが処理されます。

また、アプリ デリゲートのどこかに NSURLCache を設定することもできます。

コードを投稿しないと、分厚いスクロールの原因はわかりません。

于 2012-07-13T17:20:33.500 に答える