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

ios - 使用 dispatch_semaphore 时执行 dispatch_after

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

当我想在 dispatch_after block 中执行代码时遇到问题。
首先,我在按下按钮时调用 UIActivityIndi​​cator 以便在屏幕上显示它,并且在 uiactivityindicator 开始运行后,我想执行服务器调用,当我从服务器获得响应时,我返回该值。< br/>
问题是:当我调用我的 UIAtivityIndi​​cator 来运行,然后我调用我的服务器时,即使调用了 [UIActivityIndi​​catorInstance startAnimating]; 之后 UIActivityIndi​​cator 也不会显示在屏幕上,然后服务器操作被调用。
所以我决定使用 dispatch_after 以便在 de [UIActivityIndi​​catorInstance startAnimating]; 之后等待一段时间值,因此使用 dispatch_semaphore 告诉我操作何时完成,然后返回值。

这里最大的问题是 dispatch_after 没有被调用。 这是我的代码,感谢您能帮助我解决这个问题或您想到的其他解决方案。
我想要完成的主要想法是,我想在服务器操作执行时显示一个 UIActivityIndi​​cator,当它完成时,我想在同一方法中返回该值。




Best Answer-推荐答案


你说:

The big problem here is that the dispatch_after is not called.

是的,那是因为你用 dispatch_semaphore_wait 阻塞了主线程,所以 dispatch_after 永远没有机会在主线程上运行并且你死锁了。

我们可以指导您解决此问题,但您的代码中根本不应该有同步网络调用或信号量(出于多种原因,不仅仅是为了您的事件指示器和解决您的死锁问题)。

您应该删除这些同步网络请求,删除 dispatch_after,并删除信号量。如果您完成所有这些操作,而是遵循异步模式(例如使用完成 block ),那么您的事件指示器 View 内容将正常工作,并且您也不会出现任何死锁。

正确的答案是重构“后端管理器”以异步执行其请求(使用完成 block ),然后也使用带有 getUserStatus 方法的完成 block 模式。

例如,假设您将 _backendManagergetStatus 固定为异步行为:

- (void)getStatusWithCompletionvoid (^)(BOOL))completion {
    NSMutableURLRequest *request = ...   // build the request however appropriate
    NSURLSessionTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        BOOL status = ...;   // parse the response however appropriate
        dispatch_async(dispatch_get_main_queue(), ^{
            if (completion) completion(status);
        });
    }];
    [task resume];
}

然后您可以从您的问题中重构 getUserStatus 以获取完成处理程序:

- (void)getUserStatusWithCompletionvoid (^)(BOOL))completion {
    // This is when the UIActivityIndicator is starts running
    [Tools startActivityIndicator];

    [_backendManager getStatusWithCompletion:^(BOOL status){
        [Tools stopActivityIndicator];
        if (completion) completion(status);
    }
}

然后需要获取用户状态的代码将执行以下操作:

[obj getUserStatusWithCompletion:^(BOOL success) {
    // use `success` here
}];

// but not here

关于ios - 使用 dispatch_semaphore 时执行 dispatch_after,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33326220/

回复

使用道具 举报

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

本版积分规则

关注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