2015-05-25 4 views
-1

Я новичок в объективе c. Я пытаюсь установить кнопку сохранения, когда я нажимаю кнопку сохранения. И делать saveInBackgroundWithBlock, а также.parse saveInBackgroundWithBlock

*** Завершение приложения из-за неотображенного исключения «NSInternalInconsistencyException», причина: '- [UIKeyboardTaskQueue waitUntilAllTasksAreFinished] может вызываться только из основного потока.'

вот мой код `

saveButton.enabled = NO; 

PFQuery *medQuery = [PFQuery queryWithClassName:medicineClassName]; 

    // Retrieve the object by id 
    [medQuery getObjectInBackgroundWithId:self.receiveObjectId block:^(PFObject *medObject, NSError *error) { 

    // Now let's update it with some data 
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
    [medObject setObject:[formatter numberFromString:self.medIDTF.text] forKeyedSubscript:@"medID"]; 

     // Medicine image 
     NSData *imageData = UIImageJPEGRepresentation(self.medImage.image, 0.8f); 
     NSMutableString *tmpString = [[NSMutableString alloc] init]; 
     tmpString = [self filenameEncoderFromString:(NSMutableString *)self.medMerEngNameTF.text]; 

     NSString *fileName = [NSString stringWithFormat:@"%@.png", tmpString]; 

     PFFile *imageFile = [PFFile fileWithName:fileName data:imageData]; 
     /* 
     if (imageFile == nil) { 

      [medObject setObject:[UIImage imageNamed:@"Ironman head.png"] forKey:@"medImage"]; 
     } else { 

      [medObject setObject:imageFile forKeyedSubscript:@"medImage"]; 
     }*/ 
     [medObject setObject:imageFile forKey:@"medImage"]; 

     // other Medicine columns 
     tmpString = [self filenameEncoderFromString:(NSMutableString *)self.medMerEngNameTF.text 
        ]; 
     [medObject setObject:tmpString forKeyedSubscript:@"medMerEngName"]; 
     [medObject setObject:self.medMerChiNameTF.text forKeyedSubscript:@"medMerChiName"]; 
     [medObject setObject:self.medScienceTF.text forKeyedSubscript:@"medScienceName"]; 
     [medObject setObject:self.medCategoryTF.text forKeyedSubscript:@"medCategory"]; 

     // show progress when saving 
     MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
     hud.mode = MBProgressHUDAnimationFade; 
     hud.labelText = @"Uploading..."; 
     [hud showAnimated:YES whileExecutingBlock:^{ 
      float progress = 0.0f; 
      while (progress < 1.0f) { 

       progress += 0.01f; 
       hud.progress = progress; 
       usleep(10000); 
      } 
     }]; 

     // update medicine to parse 
     [medObject saveInBackgroundWithBlock:^(BOOL successed, NSError *error) {   
      if (successed == YES) { 
        // show success message and hide the saving progress 
        MBProgressHUD *hudd = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
        hudd.mode = MBProgressHUDModeCustomView; 
        hudd.labelText = @"Upload Successfully"; 
        hudd.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"[email protected]"]]; 
        [hudd showAnimated:YES whileExecutingBlock:^{ 
         // 
         [self setUneditable]; 
         [hud hide:YES]; 
        } completionBlock:^{ 
         //    MedicineTableViewController *mtvd = [[MedicineTableViewController alloc] init]; 
         //    [mtvd download]; 
         // Notify table view to reload the medicines from parse cloud 
         [[NSNotificationCenter defaultCenter] postNotificationName:@"refreshParse" object:self]; 

        }]; 

`

спасибо вам помочь

ответ

1

Причина, почему вы получаете эту ошибку, потому что вы пытаетесь повлиять на пользовательский интерфейс от фонового потока , saveInBackgroundWithBlock выполняет блок в фоновом потоке, что делает код пользовательского интерфейса небезопасным и нестабильным. В вашем блоке вы должны обернуть свои обновления HUD с помощью GCD (Grand Central Dispatch). Вам также необходимо будет сделать ваш вызов NSNotification таким же образом:

dispatch_async(dispatch_get_main_queue(), ^{ 

      MBProgressHUD *hudd = [MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
      hudd.mode = MBProgressHUDModeCustomView; 
      hudd.labelText = @"Upload Successfully"; 
      hudd.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"[email protected]"]]; 
      [hudd showAnimated:YES whileExecutingBlock:^{ 

      [self setUneditable]; 
      [hud hide:YES]; 

     }); 

dispatch_async(dispatch_get_main_queue(), ^{ 

      [[NSNotificationCenter defaultCenter] postNotificationName:@"refreshParse" object:self]; 

     }); 

Это должно сработать для вас.

+0

большое спасибо. @ Mrbcg. оно работает!!! Но немного глупо, если MBProgress все еще работает и swtich к следующей задаче saveInBackground, MBProgress немедленно останавливается. это не то, что я хочу для пользователя. БЛАГОДАРЯ! –

+0

Если вы не возражаете, пожалуйста, примите мой ответ. Благодаря! – mrbcg

+0

извините, я слишком новичок в этом сайте, прежде чем я просто объясню для меня ответ, что я нажимаю галочку на зеленый? –

Смежные вопросы