为啥我会收到此代码的“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 与 UIActivityIndicatorView