मैंने अपने यूआईटेबल व्यू सेल के अंदर चित्रों को async लोड करने के दो तरीके लिखे हैं। दोनों मामलों में छवि ठीक लोड होगी, लेकिन जब मैं तालिका को स्क्रॉल करूंगा तो छवियां कुछ समय में बदल जाएंगी जब तक कि स्क्रॉल समाप्त नहीं होगा और छवि सही छवि पर वापस जाएगी। ऐसा क्यों हो रहा है मुझे नहीं पता।
#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 जो कर रहा है वह पूरी तरह से सही है। आप सही हैं कि आपको मॉडल डेटा के लिए रिपॉजिटरी के रूप में सेल का उपयोग नहीं करना चाहिए, लेकिन मुझे नहीं लगता कि वह क्या कर रहा है। वह सिर्फ कस्टम सेल दे रहा है जिसे उसे खुद पेश करने की जरूरत है। इसके अलावा, और यह एक और अधिक सूक्ष्म मुद्दा है, मैं एक छवि संग्रहीत करने के बारे में सावधान रहूंगा, अपने मॉडल सरणी में अपने टेबलव्यू का समर्थन करते हुए। एक छवि कैशिंग तंत्र का उपयोग करना बेहतर है और आपके मॉडल ऑब्जेक्ट को उस कैश से पुनर्प्राप्त करना चाहिए।