Я написал пользовательский "JSON fetcher". Из моего контроллера представления я вызываю [loader start];
, и когда loader
завершается, он запускает метод делегата [self.delegate doneLoading];
.
Это все работает, однако пользовательский интерфейс заблокирован - не может ничего перемещать - пока не будет загружен загрузчик. Я думал, что если бы я выполнял загрузку через свой собственный метод делегата, этого бы не случилось. Что мне здесь не хватает? Есть ли какой-то дополнительный метод, который мне нужно вызвать?
- (void)getBandArray
{
if (![self localBandVersion] || [self remoteBandVersion] > [self localBandVersion] || !CACHING) {
NSLog(@"Band array loaded remotely.");
[self startLoadingBands];
}else{
NSLog(@"Band array loaded from disk.");
[self loadBandsFromDisk];
}
}
startLoadingBands запускает NSURLConnection, loadBandsFromDisk выглядит следующим образом:
- (void)loadBandsFromDisk
{
NSData *dataFromDisk = [NSData dataWithContentsOfFile:[self fileStringForTag:JNKBandTag]];
if (dataFromDisk) {
NSLog(@"Found band cache on disk...");
NSString *strToParse = [[NSString alloc] initWithData:dataFromDisk encoding:NSUTF8StringEncoding];
SBJsonParser *jsonObject = [[SBJsonParser alloc] init];
NSError *jsonError;
NSArray *parsedResult = [jsonObject objectWithString:strToParse error:&jsonError];
[strToParse release];
[jsonObject release];
if (parsedResult && [parsedResult count] > 0) {
NSLog(@"Parsed bands, handing over to delegate...");
NSMutableArray *bandArray = [NSMutableArray array];
for (NSDictionary *bandDict in parsedResult) {
[bandArray addObject:[JNKBand bandWithDictionary:bandDict]];
}
if ([self.delegate respondsToSelector:@selector(bandArrayArrived:)]) {
[self.delegate bandArrayArrived:bandArray];
}
}else{
NSLog(@"Error parsing bands, calling delegate...");
if ([self.delegate respondsToSelector:@selector(bandArrayFailed)]) {
[self.delegate bandArrayFailed];
}
}
}else{
if ([self.delegate respondsToSelector:@selector(bandArrayFailed)]) {
[self.delegate bandArrayFailed];
}
}
}
Странно то, что, как только соединение завершено, оно также в конечном итоге вызывает loadFileFromDisk, но это работает гладко ...