objective-c - 在自定义委托(delegate) block UI 中执行工作——为什么?

标签 objective-c cocoa-touch ios delegates

我写了一个自定义的“JSON fetcher”。从我的 View Controller 我调用 [loader start];loader完成后,它运行委托(delegate)方法[self.delegate doneLoading]; .

这一切都有效,但是 UI 被阻止 - 无法移动任何东西 - 直到加载器完成。我认为如果我通过自己的委托(delegate)方法进行加载,就不会发生这种情况。我在这里想念什么?我需要调用一些额外的方法吗?

- (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 但这很顺利......

最佳答案

这是在阻塞其他一切的主线程上运行的。您将不得不在后台进行加载。使用performSelectorInBackground:withObject在后台进行加载,如果委托(delegate)方法应该影响 UI,您应该将请求发送回主线程。

关于objective-c - 在自定义委托(delegate) block UI 中执行工作——为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6142847/

相关文章:

javascript - 如何将对象从 Objective C 传递到 javascript

ios - 更改后如何将 UIWindow window.tintColor 更改回默认值?

objective-c - NSFileManager fileExistsAtPath:isDirectory的用法

python - 按关键字的 Objective-C 字符串格式

cocoa - 将scrollViewDidScroll与多个UIScrollView一起使用

ios - 使用 iAd 时方向更改会导致 iOS 7 上的应用程序崩溃(无法识别的选择器发送到实例)

javascript - 无法让 WebAudio 通过 iOS 8 播放

ios - 需要有关在 NSFileManager 上创建目录方法的帮助

ios - CAGradientLayer 动画 "colors"但不是 "locations"

ios - NSInternalInconsistencyException 错误