1

有一个数据库列出了文档目录中的文件(目标 c - 核心数据)。每次打开程序时都会更新此列表。对于 700 个文件,程序需要 30 秒才能打开,并且在此期间单击按钮完全没有响应。

我找不到在后台执行此操作的方法。有没有办法慢慢强制处理器(cpu)?因此,当用户继续使用该程序时,让它在后台更新。

- (void)Reload_Data    
{
      id delegate = [[UIApplication sharedApplication] delegate];

      NSManagedObjectContext *context = [delegate managedObjectContext];

       NSDirectoryEnumerator *directoryEnumerator = [[NSFileManager defaultManager] enumeratorAtPath:kDocdir];

    for (NSString *pathi in directoryEnumerator){
        NSString *path = [self kDoc_dosya:pathi];

        NSError *error_iki;
        NSDictionary *file_propery = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:&error_iki];

        if (!error_iki && ![[path lastPathComponent] hasPrefix:@"."] && [file_propery fileType] != NSFileTypeDirectory) {

           NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
           NSEntityDescription *entity = [NSEntityDescription entityForName:Parcalar_s inManagedObjectContext:context];
           [fetchRequest setEntity:entity];

            NSPredicate *predicate = [NSPredicate predicateWithFormat:@"url LIKE [cd] %@",[self Doc_Sil:path]];
            [fetchRequest setPredicate:predicate];
            [fetchRequest setFetchBatchSize:1];
            [fetchRequest setFetchLimit:1];

            NSError *error = nil;
            NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];

            if (!error && [fetchedObjects count] < 1) {
               Parcalar *parca = (Parcalar *)[NSEntityDescription insertNewObjectForEntityForName:Parcalar_s inManagedObjectContext:context];
               parca.url = [self Doc_Sil:path];

                AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:path] options:nil];
               NSUInteger suresi = CMTimeGetSeconds(asset.duration);
               parca.sure = [NSNumber numberWithInteger:suresi] ;

            }
        }
   }


    NSError *error = nil;   if (![[self fetchedResultsController] performFetch:&error]) [self Alert_Uyari:[NSString stringWithFormat:@"Unresolved error %@, %@", error, [error userInfo]]];

}
4

1 回答 1

2

你是什​​么意思你找不到在后台实现这一目标的方法?

这很简单,您可以通过多种不同的方式进行操作。

  • NSOperation
  • 大中央调度
  • Core Data 新的 iOS 5 API

一个简单的例子可能如下(GCD)

dispatch_async(backgroundQueue, ^{
   // create a new context for background execution and assign it the persistent coordinator grabbed form the main context
   NSManagedObjectContext *backgroundContext = [[NSManagedObjectContext alloc] init];
   backgroundContext.persistentStoreCoordinator = persistentStoreCoordinator;

   // do your stuff here

   NSError *error;
   if (![backgroundContext save:&error])
   {
      // handle error if necessary
   }
});

backgroundQueue属于 GCD 的队列在哪里被抓取,例如

dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

因此,当您reloadData像上面那样加载应用程序调用方法时。完成后,发出通知以通知用户导入已完成。

在 GCD 和NSOperations 之后,您还需要合并来自后台上下文的更改。对于使用父/子上下文的新 CD 新 API,这不是必需的。

在下文中,您可以找到有关该主题的一些链接。

于 2013-06-09T15:17:25.697 回答