objective-c - 我如何知道我是否正在 UI 线程上执行某些操作?

标签 objective-c multithreading thread-safety

我编写了一个测试来使用 block 来试验 RestKit。我以为 RKRequest.onDidLoadResponse需要包含 dispatch_async()调用以获取主 UI 线程上的响应,但令我惊讶的是,这导致运行时异常,所以我把它拿出来,我可以很好地更新界面。

我有问题的代码如下:

- (IBAction)loadSeasons:(UIButton *)sender {
    [[RKClient sharedClient] get:@"/api/v1/seasons" usingBlock:^(RKRequest* req) {
        req.onDidLoadResponse = ^(RKResponse* res) {
            NSLog(@"Request Performed: %@", res.bodyAsString);
            self.textResponse.text = res.bodyAsString;
            //dispatch_async(dispatch_get_main_queue(), ^{
            //    NSLog(@"In main queue: %@", res.bodyAsString);
            //});
        };
    }];
}

如果我取消注释 dispatch_async block 我得到了异常(exception)。那么我怎么知道什么时候需要使用它,什么时候不需要呢?我是否应该测试一些东西来告诉我正在执行的代码是否在主线程上?

我是 Objective-C 的新手,对我来说还处于早期阶段,所以我为可能是新手的问题道歉。

更新 :当取消注释上面的代码时,会发生以下情况:
  • 控制台输出文本 (lldb)蓝色表示未提供其他信息。
  • 休息一下 libobjc.A.dylib objc_msg发送:is shown in the editor on 0x1c2009b: movl 8(%edx), %edi with the message in green:线程 1:EXC_BAD_ACCESS(代码=1,地址=0x40000008)`。
  • 最佳答案

    要回答您的问题,您可以调用 [NSThread isMainThread] 查看您当前的主题。 .但是,您不需要为您的问题执行此操作,事实上,如果您已经在主线程中运行,将执行 block 分派(dispatch)到主线程是完全合法的。

    崩溃是因为执行 block 时变量的存储方式。当第一个 block 完成时,变量使用的堆栈内存可以被覆盖,所以到你的异步 NSLog语句在第二个 block 中运行,您的变量 res已被销毁,因此在您的日志语句中使用它时它指向垃圾,从而触发崩溃。

    为了完整起见,请研究 __block变量声明。制作 res在您的第二个调度 block 中可引用我相信您必须将其声明为 __block通过在第一个 block 中声明它来将其移动到堆中的变量:__block RKResponse* response = res;然后使用 response在您发送的日志语句中。

    关于objective-c - 我如何知道我是否正在 UI 线程上执行某些操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13410066/

    相关文章:

    python - twisted 是构建多线程服务器的好选择吗?

    java - SimpleTimeLimiter 的线程安全性

    Ruby 1.8.6,SQLite3 线程安全

    ios - TableView 框架显示在意外位置

    iphone - RedLaser 设置事件区域 iPhone

    c++ - 在线程之间发送字符串数据 (Win32)

    java - 为什么DCL使用 volatile ,而不使用final?我代码运行同样的效果

    objective-c - 为什么我编译的(小的)objective-C 文件的一半是一大块零?

    objective-c - UINavigationController 内 UITabBarController 的间隙

    java - 难以理解关闭 Hook 何时执行以及如何终止 ExecutorService