0

私はコアデータを使用してプロジェクトを行っていますが、コアデータスレッドで行われたことはすべて、そのスレッドに残しておく必要があります。

APIを呼び出していくつかのニュース項目をダウンロードし、データベースにロードします。

  [self.database.managedObjectContext performBlock:^{
    for (NSDictionary *itemInfo in result) {
      NSLog(@"%@", itemInfo);
      [Item createItemWithInfo:itemInfo inManagedObjectContext:self.database.managedObjectContext];
    }

    [self.database.managedObjectContext save:nil];
  }];

私のcreateメソッドでは、オブジェクト内のすべてのデータを設定する以外に、問題のニュースアイテムに関連する画像を取得するための追加の呼び出しがあります。

+ (Item *)createItemWithInfo:(NSDictionary *)info inManagedObjectContext:(NSManagedObjectContext *)context {
  Item *item;

  NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Item"];
  request.predicate = [NSPredicate predicateWithFormat:@"itemId = %@", [info valueForKeyPath:@"News.id_contennoticias"]];
  NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"itemId" ascending:YES];
  request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

  NSError *error = nil;
  NSArray *matches = [context executeFetchRequest:request error:&error];

  if (!matches || ([matches count] > 1)) {
    // handle error
  } else if ([matches count] == 0) {
    item = [NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:context];
    item.itemId = [NSNumber numberWithInteger:[[info valueForKeyPath:@"News.id_contennoticias"] integerValue] ];
    item.title = [info valueForKeyPath:@"News.titulo_contennoticias"];
    item.summary = [info valueForKeyPath:@"News.sumario_contennoticias"];
    item.content = [info valueForKeyPath:@"News.texto_contennoticias"];

    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    dateFormat.dateFormat = @"yyyy-MM-dd hh:mm:ss";
    NSDate *creationDate = [dateFormat dateFromString:[info valueForKeyPath:@"News.fechacre_contennoticias"]];
    item.creationDate = creationDate;

    dispatch_queue_t imageDownloadQueue = dispatch_queue_create("image downloader", NULL);
    dispatch_async(imageDownloadQueue, ^{
      NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/files/imagenprincipal/%@", BASE_PATH, [info valueForKeyPath:@"News.imgprincipal"]]];
      NSData *imageData = [NSData dataWithContentsOfURL:url];
      dispatch_async(dispatch_get_current_queue(), ^{
        item.image = imageData;
      });
    });
  } else {
    item = [matches lastObject];
  }

  return item;  
}

この部分について:

dispatch_async(dispatch_get_current_queue(), ^{
  item.image = imageData;
});

エラーが発生しました。アプリがそこで停止します。またdispatch_get_current_queue()、iOS6では廃止されたとのことです。

4

1 に答える 1

2

dispatch_get_current_queue()のブロック内から呼び出されるので、直接imageDownloadQueue使用しないのはなぜですか?imageDownloadQueuemocキューで実行する場合は、を使用しないようにしてdispatch_get_current_queue()ください。

一般に、の使用には注意してdispatch_get_current_queue()ください。Apple ConcurrencyProgrammingガイドのDispatchQueuesページからの引用:

デバッグ目的または現在のキューのIDをテストするために、dispatch_get_current_queue関数を使用します。

于 2012-09-26T15:00:12.813 に答える