私のアプリでは、ユーザーがのタブの1つを押すと、UITabBar
ビューを読み込んでユーザーに表示するのに時間がかかりすぎるため、混乱する可能性があります(これは、のWebから画像を読み込むためですUITableView
)。そこで、すべての画像の読み込みが完了する前に、マルチスレッドを使用してビューを表示することにしました。
私はこのコードを使用しています:
- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[SetsCustomCell alloc] initWithFrame:CGRectZero];
}
// getting url
NSURL* imgUrl = [[NSURL alloc]initWithString:[[mainArray objectAtIndex:
indexPath.row]valueForKey:@"imageURL"]];
//put this url and current cell in the dictionary
NSDictionary* params = [NSDictionary dictionaryWithObjectsAndKeys:
imgUrl,@"localUrl",cell,@"localCell", nil];
// multithreading time (calling loadImageWithParams method)
[self performSelectorInBackground:@selector(loadImageWithParams:)
withObject:params];
return cell;
}
-(void)loadImageWithParams:(NSDictionary*)params {
NSURL* url = [params objectForKey:@"localUrl"];
cell = [params objectForKey:@"localCell"];
UIImage* thumb = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];
NSDictionary* backParams = [NSDictionary dictionaryWithObjectsAndKeys:
cell,@"localCell",thumb,@"thumb", nil];
[self performSelectorOnMainThread:@selector(setImage:)
withObject:backParams waitUntilDone:YES];
}
-(void)setImage:(NSDictionary*)params{
cell = [params objectForKey:@"localCell"];
UIImage* thumb = [params objectForKey:@"thumb"];
[cell.imageView setImage:thumb];
cell.imageView.hidden = NO;
[cell setNeedsLayout];
}
にセルが2つしかないUITableView
のですが、問題は2番目のセルだけがその画像をロードすることです。最初のセルはまだ空です。UITableView
ただし、最初のセルが表示されなくなるまでスクロールしてcellForRowAtIndexPath:
再度呼び出すと、最初のセルに画像が表示されます。
また、とを使用してマルチスレッドを作成しようとしましNSOperationQueue
たGCD
が、同じ結果が得られました。
マルチスレッドがどのように機能するかを明確に理解していないようですが、誰かが私の間違いを指摘してくれたら、とても感謝しています。
ありがとう!