【问题标题】:Break to first for loop inside multiple for loops? [duplicate]在多个 for 循环中中断到第一个 for 循环? [复制]
【发布时间】:2015-01-13 08:50:03
【问题描述】:

我正在尝试从一个循环中断到第一个循环(所以第一个循环可以继续),但如果我从[self saveContext] 点中断,我会更上一层,对吧?

- (void)arrangeAllContacts
{
    NSArray *messages = [HumanResponse allAcceptedRecordsTextMessages];
    __block CoreDataPhotoRecord *photoDetails;

    self.addressBook = ABAddressBookCreateWithOptions(NULL, NULL);

    /* NSMutableArray *emails = [NSMutableArray new]; */
    NSArray *mobiles = [NSArray new];
    NSString *name;

    if (!self.allContacts) {
        NSLog(@"NO ADDRESS BOOK ENTRIES TO SCAN");
        return;
    }

    for (int a=0; a<messages.count; a++) {
        photoDetails = (CoreDataPhotoRecord *)messages[a];

        for (int i=0; i<self.allContacts.count; i++ ) {
            ABRecordRef person = (__bridge ABRecordRef)self.allContacts[i];

            /* ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty); */
            ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty);
            CFIndex phoneNumberCount = ABMultiValueGetCount(phoneNumbers);

            for (int k=0; k<phoneNumberCount; k++) {
                CFStringRef phoneNumberValue = ABMultiValueCopyValueAtIndex(phoneNumbers, k);

                NSString *phoneNumber = (__bridge NSString *)(phoneNumberValue);
                phoneNumber = [self getCleanMobile:phoneNumber];

                if ([phoneNumber isEqualToString:photoDetails.message.mobile]) {
                    name = [self nameForPerson:self.selectedPerson];
                    mobiles = [self numbersForContact:phoneNumbers];
                    /* emails = [self emailsForContact:emails]; */

                    [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
                        photoDetails = [photoDetails MR_inContext:localContext];
                        photoDetails.message.contactName = name;
                        photoDetails.message.contactNumber = mobiles;
                    }];
                    [self saveContext];

                    // How to break to first 'for' loop?
                }
            }
        }
    }


    if (self.addressBook != nil) {
        CFRelease(self.addressBook);
    }
}

【问题讨论】:

    标签: ios objective-c loops for-loop break


    【解决方案1】:

    如果我理解正确,您想从第三个循环“中断”到第一个循环(层次结构中的顶部)?

    如果是这样,只需在开头(或循环外)定义一个布尔值,当你想中断时,将其设置为是,并在第二个循环的开头添加一个 if 语句: if (shouldBrake )喙;

    【讨论】:

      【解决方案2】:

      如前所述,定义一个布尔值并在 for 循环中检查它:
      for (int i=0; notFoundPhoneNumber &amp;&amp; i&lt;self.allContacts.count; i++ ) {

      我个人觉得为联系人做一个while循环更具可读性(我们的大脑倾向于跳过一个for循环的条件),所以你可以这样做:

      while (shouldStop)
      {
          if (i == self.allContacts.count)
          {
              shouldStop = true;
          }
          ...
      }
      

      或者在复杂的情况下做一会儿notFoundPhoneNumber &amp;&amp; i&lt;self.allContacts.count

      任何其他解决方案都需要重新设计您的数据结构(我假设您不想要它)

      【讨论】:

        【解决方案3】:

        您只需为电话号码创建一个函数并返回布尔值。

            for (int i=0; i<self.allContacts.count; i++ ) {
                ABRecordRef person = (__bridge ABRecordRef)self.allContacts[i];
        
                /* ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty); */
                ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty);
                CFIndex phoneNumberCount = ABMultiValueGetCount(phoneNumbers);
                if ([self phoneNumberThings:phoneNumberCount]) break;
            }
        

        〜〜〜〜

        - (BOOL)phoneNumberThings:(int)phoneNumberCount {
            for (int k=0; k<phoneNumberCount; k++) {
                 CFStringRef phoneNumberValue = ABMultiValueCopyValueAtIndex(phoneNumbers, k);
        
                  NSString *phoneNumber = (__bridge NSString *)(phoneNumberValue);
                  phoneNumber = [self getCleanMobile:phoneNumber];
        
                  if ([phoneNumber isEqualToString:photoDetails.message.mobile]) {
                      name = [self nameForPerson:self.selectedPerson];
                      mobiles = [self numbersForContact:phoneNumbers];
                      /* emails = [self emailsForContact:emails]; */
        
                      [MagicalRecord saveWithBlockAndWait:^(NSManagedObjectContext *localContext) {
                          photoDetails = [photoDetails MR_inContext:localContext];
                          photoDetails.message.contactName = name;
                          photoDetails.message.contactNumber = mobiles;
                      }];
                      [self saveContext];
        
                      // How to break to first 'for' loop?
                      return YES
                  }
            }
            return NO;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-04
          • 1970-01-01
          • 2021-08-27
          • 2014-03-21
          • 2019-01-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多