我正在使用NSOperationQueue & NSInvocationOperation調用我的UIViewController上的方法,然後調用另一個類中的方法,然後從Web分析XML文件並更新一些核心數據管理對象。核心數據獲取請求在後臺線程只能用於第一次獲取
此過程在我第一次運行應用程序時工作,但當我第二次調用該方法時(當再次顯示UIViewController時),它不會在XML解析器類中的executeFetchRequest語句之後執行任何行。下面是我使用的執行代碼:
我有一個UITableViewController是通吃了停車場靜態信息從我的核心數據存儲時,它加載:
- (void)viewDidLoad
{
NSLog(@"viewDidLoad");
[super viewDidLoad];
southeastCarparks = [[NSMutableArray alloc] init];
southwestCarparks = [[NSMutableArray alloc] init];
northeastCarparks = [[NSMutableArray alloc] init];
northwestCarparks = [[NSMutableArray alloc] init];
carparkLocations = [[NSMutableArray alloc] initWithObjects:southeastCarparks, southwestCarparks, northeastCarparks, northwestCarparks, nil];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"CarparkInfo" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSError *error;
self.carparkInfos = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
for (CarparkInfo *carpark in self.carparkInfos){
if ([carpark.details.region isEqualToString:@"Southeast"]){
[southeastCarparks addObject:carpark];
} else if ([carpark.details.region isEqualToString:@"Southwest"]){
[southwestCarparks addObject:carpark];
} else if ([carpark.details.region isEqualToString:@"Northeast"]){
[northeastCarparks addObject:carpark];
} else if ([carpark.details.region isEqualToString:@"Northwest"]){
[northwestCarparks addObject:carpark];
}
}
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(loadXMLData)
name:@"appDidBecomeActive"
object:nil];
}
然後當視圖出現我所說的loadXML的方法去網絡和從XML文件
- (void) viewDidAppear:(BOOL)animated
{
[self loadXMLData];
NSLog(@"viewDidAppear");
}
- (void) loadXMLData {
NSLog(@"loadXMLData");
NSOperationQueue *queue = [NSOperationQueue new];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(loadXMLDataWithOperation)
object:nil];
[queue addOperation:operation];
}
- (void) loadXMLDataWithOperation {
xmlParser = [[XMLParser alloc] loadXMLByURL:xmlFileURL];
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
}
在XMLParser的類獲得最新的停車位信息,我走xmlFileURL傳入,從網上檢索它,分析它,然後嘗試更新Co的可用空間重新數據存儲
-(id) loadXMLByURL:(NSString *)urlString
{
_carparks = [[NSMutableArray alloc] init];
NSURL *url = [NSURL URLWithString:urlString];
NSData *data = [[NSData alloc] initWithContentsOfURL:url];
parser = [[NSXMLParser alloc] initWithData:data];
parser.delegate = self;
[parser parse];
return self;
}
- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if (![elementName isEqualToString:@"carpark"]){
return;
}
currentCarpark = [Carpark alloc];
NSString *name = [attributeDict objectForKey:@"name"];
currentCarpark.name = name;
NSString *spaces = [attributeDict objectForKey:@"spaces"];
currentCarpark.spaces = spaces;
[self.carparks addObject:currentCarpark];
currentCarpark = nil;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// set up the managedObjectContext to read data from CoreData
id delegate = [[UIApplication sharedApplication] delegate];
self.managedObjectContext = [delegate managedObjectContext];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"CarparkInfo" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"code=%@",name]];
NSError *error;
CarparkInfo *cgCarpark;
// THIS IS THE LAST LINE TO BE EXECUTED THE 2ND TIME AROUND. THE APPLICATION DOESN'T THROW AN ERROR BUT DOESN'T GO ON TO UPDATE THE CARPARK OBJECT ON THE LINE AFTER
cgCarpark = [[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] lastObject];
cgCarpark.availableSpaces = spaces;
error = nil;
if (![self.managedObjectContext save:&error]) {
//Handle any error with the saving of the context
}
}
我在做我的方式使用託管對象上下文的方式錯了嗎?
預先感謝任何幫助
我想你會很高興展示如何調用這段代碼。 – 2013-03-07 02:05:54
似乎你在這一行有一個死鎖。請給我們一個你正在運行這種方法的背景。 – 2013-03-07 07:11:17
我已更新代碼以顯示如何調用該方法。有什麼辦法來檢查是否發生死鎖? – cullener 2013-03-07 11:36:00