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