我有一個UITableView,當選擇項目時,加載一個viewController,它內部使用performSelectorInBackground在後臺執行一些操作。使用performSelectorInBackground時接收內存警告
如果你慢慢點擊tableView中的項目(基本上允許在後臺完成的操作),一切正常。但是,當您快速選擇項目時,應用程序會快速返回一些內存警告,直到它崩潰,通常在大約7或8次「敲擊」或選擇之後。
任何想法,爲什麼會這樣?當我將代碼從後臺線程移動到主線程時,一切正常。您無法儘快完成tableView選擇,因爲它正在等待操作完成。
代碼片段:
//this is called from - (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
-(void) showLeaseView:(NSMutableDictionary *)selLease
{
LeaseDetailController *leaseController = [[LeaseDetailController alloc] initWithNibName:@"LeaseDetail" bundle:nil];
leaseController.lease = selLease;
//[leaseController loadData];
[detailNavController pushViewController:leaseController animated:NO];
[leaseController release];
}
//this is in LeaseDetailController
- (void)viewDidLoad {
[self performSelectorInBackground:@selector(getOptions) withObject:nil];
[super viewDidLoad];
}
-(void) getOptions
{
NSAutoreleasePool *apool = [[NSAutoreleasePool alloc] init];
NSArray *arrayOnDisk = [[NSArray alloc] initWithContentsOfFile:[appdel.settingsDir stringByAppendingPathComponent:@"optionData"]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(LEASE_ID contains[cd] %@)", [lease leaseId]];
self.options = [NSMutableArray arrayWithArray:[arrayOnDisk filteredArrayUsingPredicate:predicate]];
[arrayOnDisk release];
[apool release];
}
非常感謝,我用了那麼久纔回來給你道歉,但是當我試圖將此代碼添加到項目中,我得到了:你可以做到這一點使用一個NSOperationQueue,像這樣跟隨錯誤。它不喜歡dispatch_async命令:架構i386的未定義符號: 「_dispatch_queue_get_main」,引用自: - [LeaseDetailController getOptions] – FilthySlider 2011-03-14 21:44:24