为啥我会收到此代码的“wait_fences:未能收到回复”?

Posted

技术标签:

【中文标题】为啥我会收到此代码的“wait_fences:未能收到回复”?【英文标题】:why do I get "wait_fences: failed to receive reply" for this code?为什么我会收到此代码的“wait_fences:未能收到回复”? 【发布时间】:2011-11-07 05:19:08 【问题描述】:

为什么我会收到此代码的“wait_fences: failed to receive reply”?这是我使用通知与主线程通信的方式吗?

#import "ViewController.h"

@implementation ViewController

@synthesize  alert;


#pragma mark - Background Thread Test Methods

- (void) ConfigTasksForBackground:(id)sender
    NSLog(@"ConfigTasksForBackground - Starting");
    [NSThread sleepForTimeInterval:6];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ModelChanged" object:self];
    NSLog(@"ConfigTasksForBackground - Ending");


#pragma mark - Callbacks

- (void) ModelChangedHandler:(NSNotification *) notification 
    if ([[notification name] isEqualToString:@"ModelChanged"]) 
        NSLog(@"ModelChangedHandler");
        [self.alert dismissWithClickedButtonIndex:0 animated:false];
    


#pragma mark - View lifecycle

- (void)viewDidLoad

    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(ModelChangedHandler:) 
                                                 name:@"ModelChanged"
                                               object:nil];


- (void)viewDidAppear:(BOOL)animated

    [super viewDidAppear:animated];

    self.alert = [[[UIAlertView alloc] initWithTitle:@"Title" 
                                                    message:@"viewDidAppear" 
                                                   delegate:nil 
                                          cancelButtonTitle:nil
                                          otherButtonTitles:nil] autorelease];
    [alert show];
    [self performSelectorInBackground:@selector(ConfigTasksForBackground:) withObject:nil];




@end

输出是:

2011-11-07 15:15:42.730 test_background[6876:13603] ConfigTasksForBackground - Starting
2011-11-07 15:15:48.734 test_background[6876:13603] ModelChangedHandler
2011-11-07 15:15:49.236 test_background[6876:13603] ConfigTasksForBackground - Ending
wait_fences: failed to receive reply: 10004003

【问题讨论】:

查看 SO 帖子...***.com/questions/4241894/… 实际上并没有修复它 - wait_fences 在“ModelChangedHandler”被触发后发生 【参考方案1】:

这里有一个明显的问题。您正在从后台线程发布通知(这很好),这意味着正在后台线程上调用通知处理程序ModelChangedHandler。然后处理程序将关闭必须在主线程上完成的警报视图。尝试将您的代码更改为:

- (void) ModelChangedHandler:(NSNotification *) notification 
    if (![NSThread isMainThread]) 
        [self performSelectorOnMainThread:@selector(ModelChangedHandler:) withObject:notification waitUntilDone:NO];
    

    else if ([[notification name] isEqualToString:@"ModelChanged"]) 
        NSLog(@"ModelChangedHandler");
        [self.alert dismissWithClickedButtonIndex:0 animated:false];
    

编辑:输入太快,更改答案以反映正确的 UI 对象。

【讨论】:

谢谢 - 有趣的是它似乎没有修复它....但我明白你的意思,我可以先运行 performSelectorOnMainThread,所以你的代码是有意义的。只是我最后仍然得到“wait_fences”行。顺便说一句,您在这里的信息有点指出我在这里得到的回复可能是错误的***.com/questions/8032652/… 呃。我写了两个答案。我不认为他们是矛盾的。 wait_fences 错误可能是由我的评论引起的其他原因:线程和 UI 操作需要在主线程上是正确的。【参考方案2】:

这是摆脱 wait_fences 错误的方法。将您关闭 alertView 的行更改为使用动画,如下所示:

[self.alert dismissWithClickedButtonIndex:0 animated:YES];

我认为 wait_fences 与带有警报视图的视图动画状态有关,但很难确定。我确实认为这应该消除错误消息。我的其他答案并没有直接消除错误,但我仍然推荐它。 UI 动作应该在主线程上完成。

【讨论】:

以上是关于为啥我会收到此代码的“wait_fences:未能收到回复”?的主要内容,如果未能解决你的问题,请参考以下文章

UIAlertView:wait_fences:未能收到回复:10004003

wait_fences:未能收到回复:10004003 - viewDidLoad

wait_fences:未能收到回复:10004003(仅在 iPad 上)

wait_fences:未能收到回复:10004003 错误 - UIAlertView 与 UIActivityIndi​​catorView

为啥我会在本机代码中收到此 UnsatisfiedLinkError?

为啥我会收到此错误? “孩子未申报?