2014-09-02 38 views
-2

让我简单地解释代码。我有一个名为“LinkedParseClass”的类,它拥有关于业务的信息。然后我有一个叫做'dealParseClass'的类。基本上每个企业最多可以有3个交易。当一笔交易过去了,它的到期日我希望交易被删除。所以我从'dealParseClass'中删除那行/对象。我还保留了“numberOfActiveDeals”列中LinkedParseClass中交易数量的计数。所以,当我删除一笔交易,然后递减1。代码流意外

我有以下代码,但它不按预期流动,每次给我不同的输出。有效地,当我在那个特定的页面/视图控制器上时,我知道该地点的唯一ID。我在'dealParseClass中有一个外键。我得到了所有关键的交易。然后我试图遍历一个数组,从'LinkedParseClass'递减count(numberOfActiveDeals),然后从'dealParseClass'中删除对象。

当一个交易是在过去,我有效地检查了这一点,如果是我期待执行上述(减量和删除对象)。然而我的代码流是意想不到的。我不太确定为什么会发生这种情况。任何建议/帮助将不胜感激。

//Searching over deal object with the objectID found in place object 
    PFQuery *dealParseQuery = [PFQuery queryWithClassName:@"dealParseClass"]; 
    [dealParseQuery whereKey:@"dealPlaceObjectID" equalTo:self.previewDealModel.placeObjectId];//checks foreign key 
    [dealParseQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
     NSLog(@"ViewWillAppear Array of deal objects: %@", objects); 
     if (![objects count] == 0) {//checks to ensure the place has deals 
      for (PFObject *dealObj in objects) { 
       NSLog(@"You have just entered for"); 
       NSDate *expiryDateForValidation = dealObj[@"dealExpiryDate"]; 
       NSLog(@"Expiry date for validation is: %@", expiryDateForValidation); 
       if ([expiryDateForValidation timeIntervalSinceNow] > -61.0) { 
        [dealObj deleteInBackgroundWithBlock:^(BOOL succeeded, NSError *error) { 
         NSLog(@"You have just entered IF"); 
         PFQuery *linkedBusinessParseQuery = [PFQuery queryWithClassName:@"linkedBusinessParseClass"]; 
         [linkedBusinessParseQuery getObjectInBackgroundWithId:self.previewDealModel.placeObjectId block:^(PFObject *linkedBizobject, NSError *error) { 
          NSLog(@"Just entered linkedbusinessParseQuery"); 
          //Get original count and log it. Here for logging purposes 
          int dealCountUserDelete = [[linkedBizobject objectForKey:@"numberOfDealsActive"]intValue]; 
          NSLog(@"Original deal count: %i", dealCountUserDelete); 
          //Crucial part of the code that decrements by one 
          NSNumber *decrementNumber = [NSNumber numberWithInt:-1]; 
          [linkedBizobject incrementKey:@"numberOfDealsActive" byAmount:decrementNumber]; 
          //Get new count and log it. Here for logging purposes 
          int dealCountAfter = [[linkedBizobject objectForKey:@"numberOfDealsActive"]intValue]; 
          NSLog(@"Deal count after: %i", dealCountAfter); 
          //You update the object in the decrement. Now you must save it back to Parse 
          [linkedBizobject saveInBackground]; 
          //log deal object to be deleted 
          NSLog(@"deal object to be deleted: %@", dealObj); 

          NSLog(@"deal object has now been deleted: %@", dealObj); 
          //resetting dealcounts 
          dealCountUserDelete = 0; 
          dealCountAfter = 0; 
          NSLog(@"Reset-: dealCountUserDelete is: %d -- dealCountaAfter is: %d", dealCountUserDelete, dealCountAfter); 
          NSLog(@"Just left linkedbusinessParseQuery"); 
         }]; 
        }]; 
        NSLog(@"delete in background complete"); 

        NSLog(@"You have just left IF"); 
       } 
       NSLog(@"You have just left for"); 
      } 
     } 
    }]; 

2014-09-03 08:20:52.579 CouponLocation[4585:60b] ViewWillAppear Array of deal objects: (
    "<dealParseClass:QwrgBFnZCK:(null)> {\n dealDescription = \"Deal chelsea description\";\n dealExpiryDate = \"2014-09-02 15:48:00 +0000\";\n dealFinalPrice = 0;\n dealImage = \"<PFFile: 0x1158985a0>\";\n dealOriginalPrice = 85;\n dealPercentageOff = 0;\n dealPlaceObjectID = DYxAju6pXR;\n dealStartDate = \"2014-09-02 19:49:49 +0000\";\n dealStatus = Active;\n dealTitle = \"deal chelse\";\n dealType = \"Buy One Get One Free\";\n}", 
    "<dealParseClass:zthLtvwUop:(null)> {\n dealDescription = \"Xxx desc\";\n dealExpiryDate = \"2014-09-10 07:15:36 +0000\";\n dealFinalPrice = 0;\n dealImage = \"<PFFile: 0x115897ec0>\";\n dealOriginalPrice = 88;\n dealPercentageOff = 0;\n dealPlaceObjectID = DYxAju6pXR;\n dealStartDate = \"2014-09-03 07:15:43 +0000\";\n dealStatus = Active;\n dealTitle = xxx;\n dealType = \"Buy One Get One Half Price\";\n}", 
    "<dealParseClass:Yl5AtXfkgZ:(null)> {\n dealDescription = \"Ttt desc\";\n dealExpiryDate = \"2014-09-02 11:01:00 +0000\";\n dealFinalPrice = 0;\n dealImage = \"<PFFile: 0x1158895e0>\";\n dealOriginalPrice = 888;\n dealPercentageOff = 0;\n dealPlaceObjectID = DYxAju6pXR;\n dealStartDate = \"2014-09-02 22:01:39 +0000\";\n dealStatus = Active;\n dealTitle = ttt;\n dealType = \"Buy One Get One Free\";\n}" 
) 
2014-09-03 08:20:52.579 CouponLocation[4585:60b] You have just entered for 
2014-09-03 08:20:52.579 CouponLocation[4585:60b] Expiry date for validation is: 2014-09-02 15:48:00 +0000 
2014-09-03 08:20:52.580 CouponLocation[4585:60b] You have just left for 
2014-09-03 08:20:52.580 CouponLocation[4585:60b] You have just entered for 
2014-09-03 08:20:52.580 CouponLocation[4585:60b] Expiry date for validation is: 2014-09-10 07:15:36 +0000 
2014-09-03 08:20:52.580 CouponLocation[4585:60b] delete in background complete 
2014-09-03 08:20:52.581 CouponLocation[4585:60b] You have just left IF 
2014-09-03 08:20:52.581 CouponLocation[4585:60b] You have just left for 
2014-09-03 08:20:52.581 CouponLocation[4585:60b] You have just entered for 
2014-09-03 08:20:52.581 CouponLocation[4585:60b] Expiry date for validation is: 2014-09-02 11:01:00 +0000 
2014-09-03 08:20:52.581 CouponLocation[4585:60b] You have just left for 
2014-09-03 08:20:53.483 CouponLocation[4585:60b] You have just entered IF 
2014-09-03 08:20:53.713 CouponLocation[4585:60b] Just entered linkedbusinessParseQuery 
2014-09-03 08:20:53.714 CouponLocation[4585:60b] Original deal count: 3 
2014-09-03 08:20:53.715 CouponLocation[4585:60b] Deal count after: 2 
2014-09-03 08:20:53.715 CouponLocation[4585:60b] deal object to be deleted: <dealParseClass:zthLtvwUop:(null)> { 
    dealDescription = "Xxx desc"; 
    dealExpiryDate = "2014-09-10 07:15:36 +0000"; 
    dealFinalPrice = 0; 
    dealImage = "<PFFile: 0x115897ec0>"; 
    dealOriginalPrice = 88; 
    dealPercentageOff = 0; 
    dealPlaceObjectID = DYxAju6pXR; 
    dealStartDate = "2014-09-03 07:15:43 +0000"; 
    dealStatus = Active; 
    dealTitle = xxx; 
    dealType = "Buy One Get One Half Price"; 
} 
2014-09-03 08:20:53.716 CouponLocation[4585:60b] deal object has now been deleted: <dealParseClass:zthLtvwUop:(null)> { 
    dealDescription = "Xxx desc"; 
    dealExpiryDate = "2014-09-10 07:15:36 +0000"; 
    dealFinalPrice = 0; 
    dealImage = "<PFFile: 0x115897ec0>"; 
    dealOriginalPrice = 88; 
    dealPercentageOff = 0; 
    dealPlaceObjectID = DYxAju6pXR; 
    dealStartDate = "2014-09-03 07:15:43 +0000"; 
    dealStatus = Active; 
    dealTitle = xxx; 
    dealType = "Buy One Get One Half Price"; 
} 
2014-09-03 08:20:53.716 CouponLocation[4585:60b] Reset-: dealCountUserDelete is: 0 -- dealCountaAfter is: 0 
2014-09-03 08:20:53.716 CouponLocation[4585:60b] Just left linkedbusinessParseQuery 

回答

2

与您的代码的基本问题是你踢掉几个异步任务,然后,在代码的最下一行认为他们已经完成了您的信息已被更新。那是错的。例如。当您拨打[dealObj deleteInBackground]时,您不能指望该对象在下一行中消失。因此方法名称(“在后台删除”)。

如果要在异步任务成功后执行某些代码,可以使用带有完成块的分析方法,例如,

[dealObj deleteInBackgroundWithBlock:^(BOOL succeeded, NSError *error) { 
    if(succeeded) { 
      NSLog(@"delete success!"); 
      // now you know the object has been deleted 
    } 
}]; 

NSLog(@"dealObj may or may not still exist at this point!"); 

或者,您也可以致电解析对象相应同步方法。在这种情况下,您需要注意不要在主队列中执行此操作,否则当这些调用正在进行时,您的应用将完全无响应:

BOOL result = [dealObj delete]; 
if(result) { 
    NSLog(@"delete success!"); 
} 
+0

嗨BlackRider,感谢您的帮助。我已经修改了将它放在deleteInBackgroundWithBlock中的代码,请参阅上面修改的帖子。但流量仍然不正确。我必须在其他地方进行更改吗? – Anthony 2014-09-03 07:30:52

+0

这是一个好的开始。我还建议在完成块中检查调用的结果(因为它可能成功也可能不成功)。看看我如何在我的代码中使用变量'succeeded'来缩小上面的代码。 – Macondo2Seattle 2014-09-03 16:29:39

+0

很酷。流程并不完全如我所想象的那样,但我已经测试过,似乎每次都有效。谢谢! – Anthony 2014-09-03 18:25:07