如何解决在自定义委托中执行工作会阻止用户界面-为什么?
| 我编写了一个自定义\“ JSON fetcher \”。从我的视图控制器中,我调用[loader start];
,并在完成loader
时运行委托方法[self.delegate doneLoading];
。
所有这些工作正常,但是UI被阻塞-无法移动任何东西-直到加载程序完成。我认为,如果我通过自己的委托方法进行加载,则不会发生这种情况。我在这里想念什么?我需要调用一些额外的方法吗?
- (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,但这很顺利。
解决方法
这在阻止其他所有内容的主线程上运行。您将必须在后台进行加载。使用ѭ5进行后台加载,如果应该使用委托方法影响UI,则应将请求发送回主线程。
,您的方法不错,但是您需要编写代码以将in6中完成的工作放到后台线程中。现在,控制流继续进入
[loader start]
,并执行您在其中编写的任何代码,调用您的委托,并在调用start之后返回到下一行代码。
在不了解您在做什么的情况下,我无法确切地说出如何完成后台线程,但是看看NSOperationQueue和NSURLConnection异步方法将是一个不错的起点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。