我開發iPhone應用程序在我從後臺服務器下載圖像,泰伯維滾動崩潰的應用程序
這裏查看我的應用程序,
當我Button 1
點擊我正在取5數據從服務器還圖像,當用戶向上滾動時獲取數據後,我再次從服務器獲取新的5個數據,當用戶向上滾動時,我從服務器獲取新的5個數據等等。
擷取以下Button 1
數據,如果我在Button 2
點擊我取消我以前的Button 1
螺紋和我對Button 2
獲取新的5個數據,並再次滾動它獲取新的5個數據同按鈕1
但一段時間後,同時重新加載的tableview我的應用程序變得崩潰,並顯示:由於未捕獲的異常 'NSRangeException',原因 終止應用程序:' - [__ NSArrayM objectAtIndex:]:指數28超出範圍[0 .. 4]
這裏是我的代碼片段:
- (void)viewDidLoad
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self fetchDataForButton1];
dispatch_async(dispatch_get_main_queue(), ^(void) {
[tableView reloadData];
});
});
}
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
if(it is last row then fetch new 5 data)
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//Code runs on background thread
[self LoadMoreData];
dispatch_async(dispatch_get_main_queue(), ^(void) {
//Code here is run on the main thread
[_tblList reloadData];
});
});
}else{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self beginBackgroundFetchTask];
[self downloadImage_3:indexPath];
[self endBackgroundFetchTask];
});
}
}
-(void)downloadImage_3:(NSIndexPath *)path{
UIImage *img = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:ImagePath]]];
if (img) {
[dicImages_msg setObject:img forKey:[[msg_array objectAtIndex:path.row] valueForKey:@"Merchant_SmallImage"]];
}
[_tblList performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
}
- (void) beginBackgroundFetchTask
{
self.backgroundFetchTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[self endBackgroundFetchTask];
}];
}
- (void) endBackgroundFetchTask
{
[[UIApplication sharedApplication] endBackgroundTask: self.backgroundFetchTask];
self.backgroundFetchTask = UIBackgroundTaskInvalid;
NSLog(@"ended BackgroundFetchTask");
}
-(void)LoadMoreData
{
//Fetches new 5 data from server...
}
嘗試調試應用程序,將斷點上的cellForRowAtIndexPath。看看陣列何時出界。你得到的錯誤是因爲數組在特定的indexPath.row上得到了空值。 – z22
**原因:[__NSArrayM objectAtIndex:]:索引28超出界限[0..4] **,您嘗試訪問索引爲28的對象,但您的數組只有5個元素 – iNoob
您是正確的傢伙,但是當我單擊我已經停止提取'按鈕1'的數據,並且我正在初始化我的數組並且再次獲取'按鈕2'的新數據,但是因爲它仍然提取'按鈕1'索引** 28 **的數據而發生崩潰是'按鈕1'我該如何阻止'按鈕1'的線程?點擊'按鈕2' – Krunal