【问题标题】:Threading works in simulator but not on iPhone线程在模拟器中有效,但在 iPhone 上无效
【发布时间】:2009-03-04 20:55:05
【问题描述】:

我正在尝试在进行后台处理时显示 UIActivityIndi​​catorView。 下面的简化代码在我在模拟器中尝试时有效(显示警报)..但是当我从 Xcode 将它下载到我的手机时,后台线程似乎根本没有被调用。 (警报永远不会显示)
有任何想法吗?

 -(void)viewDidLoad {   
    [self performSelectorInBackground:@selector(runInAnotherThread) withObject:nil];

}

-(void) runInAnotherThread {
    NSAutoreleasePool *pool = [ [ NSAutoreleasePool alloc ] init ];
  int i;
    for(i=0;i < 1000 ;i ++){
        NSLog(@"INDEX = %d", i);
    }

    [self performSelectorOnMainThread : @ selector(backToMainThread ) withObject:nil waitUntilDone:NO]; 
    [ pool release ];
}

-(void) backToMainThread {

    UIAlertView *completeAlert = [[UIAlertView alloc] 
                     initWithTitle:@"Back to main "
                message: @"Success" 
                delegate:nil 
                cancelButtonTitle:@"OK" 
                otherButtonTitles:nil];
    [completeAlert show];
    [completeAlert release];    
}

【问题讨论】:

  • 另外,对于多线程来说,NSOperation 和 NSOperationQueue 确实值得研究。它真的让你的生活更轻松

标签: iphone ios-simulator


【解决方案1】:

您是否尝试过清理构建?我刚刚在我的设备和模拟器上运行了你的代码,它在两种情况下都能正常工作

【讨论】:

    【解决方案2】:

    使用 NSOperation 代替原始线程操作。它为您抽象了各种东西(优先级、自动释放池等......)。 ?您可以简单地向您的 NSOperation 子类添加某种委托,以便在需要时获得回调。

    【讨论】:

      【解决方案3】:

      感谢您这么快回复!

      事实证明,问题根本不在此代码片段中。我根据钥匙串中的值执行此代码。虽然我的模拟器的钥匙串有这个值,但我的测试 iphone 没有这个值。

      觉得打扰大家真是太傻了。但是跟进 nduplessis 的回复帮助我缩小了问题的范围。

      【讨论】:

      • 您应该使用此信息更新您的问题,而不是将其放在答案中,这样其他人就不会尝试回答。
      • 正如 Kristopher 所说,您可以更新原始问题删除此答案。
      猜你喜欢
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多