У меня есть метод, который проверяет буфер на приложение становится активным: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, похоже, не работает.
Вот скриншот моего основного потока, вися:
Вот функция, где она висит:
- (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");
}
}];
}
Попробуйте переходящий в 'DISPATCH_QUEUE_SERIAL' (' NULL') или 'DISPATCH_QUEUE_CONCURRENT' вместо 0 и посмотреть, поможет ли это. – JAL
Обновите свой вопрос методом 'checkClipboard'. – rmaddy