【问题标题】:NSNotification used between two controllers is crashing两个控制器之间使用的 NSNotification 崩溃
【发布时间】:2016-09-21 10:51:27
【问题描述】:

我正在使用以下代码

First.m:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(registerTok) name:@"registerTok" object:nil];  

[Second serviceCall:[NSString stringWithFormat:@"%@%@",BASEURL, USER_LOGIN] withParameter:parameters ofType:USER_SIGNIN];

Second.m:

+(void)serviceCall:(NSString*)url withParameter:(NSDictionary*)parameter ofType:(int)type{

AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:url]];  
        --------------line1------------------  
        [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];  
        manager.responseSerializer = [AFJSONResponseSerializer serializer];  
        manager.requestSerializer = [AFHTTPRequestSerializer serializer];
        [manager POST:url parameters:parameter success:^(AFHTTPRequestOperation *operation, id responseObject)  {

            [[NSNotificationCenter defaultCenter] postNotificationName:@"registerToken" object:nil userInfo:nil];---breaking101

}

上面的通知代码有问题。如果我写 [[NSNotificationCenter defaultCenter] postNotificationName:@"registerToken" object:nil userInfo:nil]; 在 line1,它正在工作。我认为这与某些对象问题有关。请帮忙。我从来没有使用过通知中心。

【问题讨论】:

  • 显示完整的崩溃日志/堆栈跟踪,包括异常文本。
  • 在 first.m 文件中添加方法 registerTok.

标签: ios objective-c afnetworking nsuserdefaults nsnotificationcenter


【解决方案1】:

这里有一些问题:

  1. 您发送的通知(“registerToken”)不是您正在收听的通知(“registerTok”)。
  2. 您定义的选择器应采用一个参数 - (NSNotification *),如苹果文档 here 中所述
  3. AFHTTPRequestOperationManagerPOST:parameters:success: 方法的成功块在任意线程上执行。您可能希望在触发通知时指定要在其上执行方法的线程/队列。当您在第 1 行发布通知时,它会起作用,因为该通知是在当前线程上执行的。

附:如果您仍然有问题,请添加您遇到的错误的完整日志,这样可以更好地回答您的问题。

【讨论】:

  • 我不明白这个崩溃日志:这是崩溃 5 月 24 日 16:19:49 Aksharas-iPhone wifid[15] :WiFi:[485779789.610131]:5 月 24 日 16:19:49 Aksharas-iPhone wifid[15] :驱动程序的 rssi 事件太频繁(0.283584 秒),忽略 5 月 24 日 16:19:49 Aksharas-iPhone wifid[15] :5 月 24 日 16:19:50 Aksharas- iPhone 锁定d[52] : 00281000 set_response_error: handle_get_value GetProhibited
  • 这是确切的崩溃行吗?程序执行停止的最后一行?
  • 是的。我在崩溃的行之前添加了一个字符串“这是崩溃”。它正在给 EXC_BAD_ACCESS
  • 您发布的错误与您的NSNotification 使用无关。这是对它的解释:stackoverflow.com/questions/22460991/… 所以你可能做的唯一错误是在某个循环中触发网络调用(可能是因为错误的调用或愚蠢的错误)。您可以在模拟器上对其进行测试,以确认您的应用是否只是导致问题的原因。如果是,那么您需要检查其余代码,看看您在哪里搞砸了网络调用。
  • 嘿.. 你是对的。我认为这是线程问题。以下代码有效,为了发布通知,[[NSNotificationCenter defaultCenter] postNotificationName:@"registerTok" object:self];为了观察它, [[NSNotificationCenter defaultCenter] addObserverForName: @"registerTok" object: nil queue: [NSOperationQueue mainQueue] usingBlock: ^(NSNotification *notification) {[self registerDeviceToken:notification]; NSLog (@"网络宕机: %@", 通知); }];
【解决方案2】:

您使用名称发布通知:@"registerToken" 并观察@"registerTok" 通知。这两个名字必须相同

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(registerTok:) name:@"registerToken" object:nil];

同时添加 registerTok 方法

-(void)registerTok:(NSNotification*)notification {
  ...
}

【讨论】:

  • 抱歉打错了,但我已经正确编码了..名字是一样的..
【解决方案3】:

我认为你没有定义选择器方法 registerTok 那样它就崩溃了。

-(void)registerTok:(NSNotification*)notification {
  ...
}

【讨论】:

    猜你喜欢
    • 2012-10-17
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多