在多个for循环中打破第一个for循环?

时间:2014-11-16 10:06:58

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

我正试图从循环中断到第一个循环(所以第一个循环可以继续),但如果我从点[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);
    }
}

3 个答案:

答案 0 :(得分:1)

如果我理解正确,你想&#34;打破&#34;从第三个循环到第一个循环(层次结构中的顶部循环)?

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

答案 1 :(得分:1)

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

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

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

或在复杂条件notFoundPhoneNumber && i<self.allContacts.count

上做一段时间

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

答案 2 :(得分:1)

您只需为电话号码设置函数并返回布尔值。

    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;
}