2015-05-24 5 views
1

Мое приложение разбивается, и я не могу отследить ошибку.WatchKit crash on sendResponse

Его убеждали меня на аварии:

Assertion failure in -[UIWatchKitExtensionRequestAction sendResponse:], /SourceCache/BaseBoard/BaseBoard-98.3/BaseBoard/BSAction.m:221

**Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'this request has been neutered - you can't call -sendResponse: twice nor after encoding it'** 

**First throw call stack: 
(0x1823342d8 0x193b580e4 0x182334198 0x1831e8ed4 0x188812ab4 0x10003cf94 0x10004708c 0x188812a08 0x18745dab4 0x18871f778 0x10003cfd4 0x10003cf94 0x10004ab54 0x10004c248 0x19438922c 0x194388ef0) 
libc++abi.dylib: terminating with uncaught exception of type NSException** 

Я попытался положить контрольную точку исключения в, и до сих пор не может отслеживать его вниз. Есть идеи?

Спасибо!

EDIT:

AppDelegate.m:

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply { 
    if (userInfo[@"pfquery_request"]) { 
     NSLog(@"Starting PFQuery"); // won't print out to console since you're running the watch extension 

     NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
     [formatter setDateStyle:NSDateFormatterMediumStyle]; 
     NSString *dateToday = [formatter stringFromDate:[NSDate date]]; 
     NSString *dateTodayShort = [dateToday substringToIndex:[dateToday length] -6]; 

     // Get JSON file path 
     NSString *JSONFilePath = [[NSBundle mainBundle] pathForResource:@"Days" ofType:@"json"]; 
     NSData *JSONData = [NSData dataWithContentsOfFile:JSONFilePath]; 
     NSDictionary *JSONDictionary = [NSJSONSerialization JSONObjectWithData:JSONData options:kNilOptions error:nil]; 
     NSArray *days; 
     days = JSONDictionary[@"days"]; 

     // Iterate thru JSON to find Data for Today 
     NSObject *todayJson; 
     for (NSObject *object in days) { 
      NSString *dateObject = [object valueForKey:@"day"]; 
      if ([dateObject isEqualToString:dateTodayShort]) { 
       todayJson = object; 
       NSString *textToday = [todayJson valueForKey:@"text"]; 

       // App Group 
       NSString *container = @"group.com.rr.mm"; 
       NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:container]; 
       [defaults setValue:textToday forKey:@"textSaved"]; 
      } 
     } 
     reply(@{@"success": @(YES)}); 
    } 
    reply(@{@"success": @(NO)}); 
} 

Я запрашивать данные в обоих моих WatchKit InterfaceController.m и мой WatchKit GlanceController.m с той же вещи:

- (void)willActivate { 
    // This method is called when watch view controller is about to be visible to user 
    [super willActivate]; 

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2.0 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
     [WKInterfaceController 
     openParentApplication:@{@"pfquery_request": @"dumm_val"} 
     reply:^(NSDictionary *replyInfo, NSError *error) { 
      NSLog(@"User Info: %@", replyInfo); 
      NSLog(@"Error: %@", error); 

      if ([replyInfo[@"success"] boolValue]) { 

       // Get Saved data 
       NSString *container = @"group.com.rr.mm"; 
       NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:container]; 
       NSString *text = [defaults valueForKey:@"textSaved"]; 

       // Set Saved Data to Global String 
       textGlobal = text; 

       // Set text Label 
       self.textVerseLabelWatch.text = text; 
      } 
     }]; 
    }); 
} 
+0

Мы не волшебники, предоставьте код, в котором вы называете '-sendResponse' и любой другой необходимый код. – Schemetrical

+0

@Schemetrical добавил некоторый код, спасибо !! – SRMR

+1

Bingo, ошибка найдено: D – Schemetrical

ответ

2

Предполагая, что userInfo[@"pfquery_request"] существует, инструкция if будет проходить, и код будет работать внутри оператора if, включая reply(@{@"success": @(YES)});. Сразу после, независимо от того, завершается ли заявление if или нет, он будет работать reply(@{@"success": @(NO)});. Вот почему его называют дважды.

Используйте вместо этого вместо этого.

- (void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply:(void (^)(NSDictionary *))reply { 
    if (userInfo[@"pfquery_request"]) { 
     NSLog(@"Starting PFQuery"); // won't print out to console since you're running the watch extension 

     NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 
     [formatter setDateStyle:NSDateFormatterMediumStyle]; 
     NSString *dateToday = [formatter stringFromDate:[NSDate date]]; 
     NSString *dateTodayShort = [dateToday substringToIndex:[dateToday length] -6]; 

     // Get JSON file path 
     NSString *JSONFilePath = [[NSBundle mainBundle] pathForResource:@"Days" ofType:@"json"]; 
     NSData *JSONData = [NSData dataWithContentsOfFile:JSONFilePath]; 
     NSDictionary *JSONDictionary = [NSJSONSerialization JSONObjectWithData:JSONData options:kNilOptions error:nil]; 
     NSArray *days; 
     days = JSONDictionary[@"days"]; 

     // Iterate thru JSON to find Data for Today 
     NSObject *todayJson; 
     for (NSObject *object in days) { 
      NSString *dateObject = [object valueForKey:@"day"]; 
      if ([dateObject isEqualToString:dateTodayShort]) { 
       todayJson = object; 
       NSString *textToday = [todayJson valueForKey:@"text"]; 

       // App Group 
       NSString *container = @"group.com.rr.mm"; 
       NSUserDefaults *defaults = [[NSUserDefaults alloc] initWithSuiteName:container]; 
       [defaults setValue:textToday forKey:@"textSaved"]; 
      } 
     } 
     reply(@{@"success": @(YES)}); 
    } else { 
     reply(@{@"success": @(NO)}); 
    } 
} 
+0

Удивительно, позвольте мне попробовать! Кроме того, я не верю, что мне даже придется использовать 'userInfo [@" pfquery_request "] сейчас, потому что я использую локальный статический json-файл, поэтому как бы вы предложили построить в случае' userInfo [@ " pfquery_request "]' не существует? БЛАГОДАРЯ! – SRMR

+0

Вы вызываете handleWatchKitExtensionRequest несколько раз? – Schemetrical

+0

Я называю это в своем «AppDelegate», а затем запрашиваю как у моего WatchKit 'InterfaceController', так и на« GlanceController ». Я отправил код «InterfaceController» и «GlanceController» в ваш запрос, чтобы показать эту сторону. – SRMR

1

Этот сбой часто случается когда блок завершения, такой как один в didReceiveRemoteNotification:fetchCompletionHandler: случайно вызван дважды. Вы не отправили какие-либо образцы кода, но начните с того, что вы не сделали что-то вроде вызываемого reply() дважды в handleWatchKitExtensionRequest:userInfo:reply:.

+0

Это помогает мне в нулевом значении того, что происходит. Я отправил свой код 'AppDelegate', где я делаю' handleWatchKitExtensionRequest: userInfo: reply: '... это тип вызова' reply() 'дважды, что вы говорили мне, что мне нужно убедиться, что я не делаю ? Или это то, что у меня есть? Благодаря! – SRMR

+0

Как уже упоминалось @Schemetrical, код, который вы опубликовали, вызывает 'reply()' дважды. – bgilham

+0

Ahhh !! Ты жжешь. Я думаю, что я собираюсь удалить выражение 'userInfo [@" pfquery_request "]' if. – SRMR