ฉันได้เขียนสองวิธีเพื่อ async โหลดภาพภายในเซลล์ UITableView ของฉัน ในทั้งสองกรณีรูปภาพจะโหลดได้ดี แต่เมื่อฉันจะเลื่อนตารางรูปภาพจะเปลี่ยนไปสองสามครั้งจนกว่าการเลื่อนจะสิ้นสุดและภาพจะกลับไปเป็นภาพที่ถูกต้อง ฉันไม่รู้ว่าทำไมสิ่งนี้จึงเกิดขึ้น
#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
- (void)viewDidLoad
{
[super viewDidLoad];
dispatch_async(kBgQueue, ^{
NSData* data = [NSData dataWithContentsOfURL: [NSURL URLWithString:
@"http://myurl.com/getMovies.php"]];
[self performSelectorOnMainThread:@selector(fetchedData:)
withObject:data waitUntilDone:YES];
});
}
-(void)fetchedData:(NSData *)data
{
NSError* error;
myJson = [NSJSONSerialization
JSONObjectWithData:data
options:kNilOptions
error:&error];
[_myTableView reloadData];
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
// Return the number of rows in the section.
// Usually the number of items in your array (the one that holds your list)
NSLog(@"myJson count: %d",[myJson count]);
return [myJson count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
myCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil) {
cell = [[myCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
dispatch_async(kBgQueue, ^{
NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://myurl.com/%@.jpg",[[myJson objectAtIndex:indexPath.row] objectForKey:@"movieId"]]]];
dispatch_async(dispatch_get_main_queue(), ^{
cell.poster.image = [UIImage imageWithData:imgData];
});
});
return cell;
}
... ...
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
myCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil) {
cell = [[myCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"http://myurl.com/%@.jpg",[[myJson objectAtIndex:indexPath.row] objectForKey:@"movieId"]]];
NSURLRequest* request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse * response,
NSData * data,
NSError * error) {
if (!error){
cell.poster.image = [UIImage imageWithData:data];
// do whatever you want with image
}
}];
return cell;
}
poster
อะไร นั่นคือมุมมองภาพในเซลล์ที่กำหนดเองของเขาดังนั้นสิ่งที่ EXEC_BAD_ACCESS กำลังทำอยู่นั้นถูกต้องสมบูรณ์ คุณถูกต้องที่คุณไม่ควรใช้เซลล์เป็นที่เก็บข้อมูลโมเดล แต่ฉันไม่คิดว่านั่นคือสิ่งที่เขาทำ เขาแค่ให้เซลล์ที่กำหนดเองในสิ่งที่มันต้องการนำเสนอ นอกจากนี้และนี่เป็นปัญหาที่ละเอียดอ่อนกว่านี้ฉันจะระวังเรื่องการจัดเก็บรูปภาพด้วยตัวเองในอาเรย์รุ่นของคุณที่สนับสนุนมุมมองตารางของคุณ เป็นการดีกว่าที่จะใช้กลไกการแคชรูปภาพและวัตถุโมเดลของคุณควรดึงจากแคชนั้น