• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - iPad 上的后台计算会阻止用户界面

[复制链接]
菜鸟教程小白 发表于 2022-12-12 08:54:41 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在尝试使用后台线程在 iPad 上进行一些计算。 问题是即使您正在运行计算。运行时 UI 被阻止... 我做错了什么。

[mc evaluateFormula:adapted runNo:10000];

这是从 IBAction 调用的。

这是被调用的代码:

-(void)evaluateFormulaNSDictionary *)frm runNoNSUInteger)runCount
{

    self.runCount = runCount;
    self.frm = frm;
    [self performSelectorInBackgroundselector(backgroundEvalFrm) withObject:nil];

//    for (int i = 0; i < runCount; i++) {
//        [self runFormula:frm];
//    }
//    

}

-(void)backgroundEvalFrm
{
    percentVal = self.runCount / 100;
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue setMaxConcurrentOperationCount:20];



    for (int i = 0; i<self.runCount; i++) {
        NSInvocationOperation *op =[[NSInvocationOperation alloc] initWithTarget:self selectorselector(runFormula object:self.frm];
        [queue addOperationp];

    }

}

那么,为什么 UI 会被阻止?

这里是线程返回码……都在同一个类中

-(void)runFormulaNSDictionary *)frm
{
    NSMutableString *formula = [[frm objectForKey:kFormulaExpresion] mutableCopy];
    NSArray *variables = [frm objectForKey:kVariableArray];
    NSArray *evals = [self evaluateVariables:variables];


       for (NSDictionary *var in evals) {
           NSString *sym = [var objectForKey:kVariableSymbol];
           [formula replaceOccurrencesOfString:sym withString:[[var objectForKey"numVal"] stringValue] options:NSCaseInsensitiveSearch range:NSMakeRange(0, [formula length])];
    }
    //parse formula
    //NSLog(@"formula to parse:%@",formula);
    NSNumber *resNo = [formula numberByEvaluatingString];
    // NSLog(@"formula %@ the result : %f",formula,[resNo doubleValue]);
    //NSNumber *resNo = [NSNumber numberWithDouble:result];
    [self performSelectorOnMainThreadselector(addNewResult withObject:resNo waitUntilDone:NO];
}

#pragma mark -- data aggregation delegate
-(void)addNewResultNSNumber *)nr
{
     NSLog(@"index : %i result: %f",currentIndex,[nr doubleValue]);
    [[self delegate] didReceiveResult:nr];
    resultsArray[currentIndex]=[nr doubleValue];
    currentIndex ++;
    if (  (currentIndex % percentVal) == 0) {
        [[self delegate] percentCompleted];
    }
}



Best Answer-推荐答案


如果您的计算都以不协调的方式(很可能)竞争相同的资源(即 CPU 或 I/O),那么您应该显着降低最大并发操作数 - 尝试 2。很有可能,它们会使用更少的时间/精力完成。此外,在执行计算期间,主线程不会减少到 CPU 时间的 5% 以下(结果:UI 响应更快)。

关于ios - iPad 上的后台计算会阻止用户界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15008493/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap