2015-11-20 2 views
0

У меня есть метод, который проверяет буфер на приложение становится активным:applicationDidBecomeActive метод блокирует мой UI

- (void)applicationDidBecomeActive:(UIApplication *)application { 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"reload" object:nil]; 
    dispatch_queue_t backgroundQueue = dispatch_queue_create("clipboardQueue", 0); 
    dispatch_async(backgroundQueue, ^{ 
     [self checkClipboard]; 
    }); 
} 

но приложение висит на чрезмерное количество времени (как представляется, Regex проверки данных в буфер обмена) - как я могу заставить этот процесс работать в другом потоке? кажется, мой обычный метод GCD, похоже, не работает.

Вот скриншот моего основного потока, вися: enter image description here

Вот функция, где она висит:

- (BOOL)validateUrl:(NSString *)candidate { 
    NSString *urlRegEx = @"\\b(?:(?:https?|ftp):\\/\\/)(?:\\S+(?::\\S*)[email protected])?(?:(?!10(?:\\.\\d{1,3}){3})(?!127(?:\\.\\d{1,3}){3})(?!169\\.254(?:\\.\\d{1,3}){2})(?!192\\.168(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\x{00a1}-\\x{ffff}0-9]+-?)*[a-z\\x{00a1}-\\x{ffff}0-9]+)(?:\\.(?:[a-z\\x{00a1}-\\x{ffff}0-9]+-?)*[a-z\\x{00a1}-\\x{ffff}0-9]+)*(?:\\.(?:[a-z\\x{00a1}-\\x{ffff}]{2,})))(?::\\d{2,5})?(?:\\/[^\\s]*)?\\b(\\/)?"; 
    NSPredicate *urlTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", urlRegEx]; 
    return [urlTest evaluateWithObject:candidate]; 
} 

вот мой checkClipboard метод:

- (void)checkClipboard { 
    [[ProfileManager sharedInstance] getUserProfile:^(BOOL done, Profile *profile, NSInteger status) { 
     if (done) { 
      NSURL *lastUrl = [NSURL URLWithString:[[NSUserDefaults standardUserDefaults] stringForKey:@"clipboard"]]; 
      UIPasteboard *pb = [UIPasteboard generalPasteboard]; 
      NSMutableString *urlString = pb.string.mutableCopy; 

      if (urlString.length) { 
       if (![urlString containsString:@"http"]) { 
        urlString = [NSString stringWithFormat:@"http://%@",urlString].mutableCopy; 
       } 
       BOOL urlValidate = [self validateUrl:urlString]; 
       if (urlValidate) { 
        if (!pb.string.length || [urlString isEqualToString:lastUrl.absoluteString] || !urlValidate) { 
         return; 
        } else { 

         dispatch_async(dispatch_get_main_queue(), ^{ 

          //popup toast code 

         }); 
        } 
       } 
      } 

     } else { 
      NSLog(@"Not Logged In"); 
     } 
    }]; 

} 
+0

Попробуйте переходящий в 'DISPATCH_QUEUE_SERIAL' (' NULL') или 'DISPATCH_QUEUE_CONCURRENT' вместо 0 и посмотреть, поможет ли это. – JAL

+0

Обновите свой вопрос методом 'checkClipboard'. – rmaddy

ответ

1

кажется checkClipboard метод звонки valudateURL в основном потоке, что-то вроде этого:

dispatch_async(dispatch_get_main_queue(), ^{ 
     [self valudateURL]; 
}); 

Так что, если вы хотите valudateURL работать в неосновной нити в этом случае, вы должны назвать его просто без dispatch_async.

- отредактированный -

Да, так getUserProfile: блок работает в основном потоке, как вы можете видеть на скриншоте, поэтому он блокирует приложение. Так что если вы хотите validateUrl: полный: работать в фоновом режиме, вы должны назвать его dispatch_async там, что-то вроде этого:

- (void)checkClipboard { 
    [[ProfileManager sharedInstance] getUserProfile:^(BOOL done, Profile *profile, NSInteger status) { 
... 
    dispatch_queue_t backgroundQueue = dispatch_queue_create("clipboardQueue", 0); 
    dispatch_async(backgroundQueue, ^{ 
     [self validateUrl:urlString complete:^(BOOL urlValidate) { 
      ... 
      dispatch_async(dispatch_get_main_queue(), ^{ 
       //popup toast code 
      }); 
     }]; 
    }); 
}]; 
} 
Смежные вопросы