1

配列からデータを取得する UITableView があります。ただし、その配列にデータを入力するには、大量のデータを Web からダウンロードして解析する必要があります。その場合、これらの操作をバックグラウンド スレッドで実行したいと考えています。ここに私がこれまでに持っているものがあります:

@interface MyClass()

@property (nonatomic, strong) NSArray *model;

@end


@implementation MyClass

- (void) getData {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
       NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:SOME_URL]];
       if (data) {
          NSMutableArray *arr = [NSMutableArray array];
          //Populate arr with data just fetched, which can take a while
          dispatch_async(dispatch_get_main_queue(), ^{
             //THIS IS THE STEP I AM UNSURE ABOUT. SHOULD I DO:
             self.model = arr;
             //OR
             self.model = [NSArray arrayWithArray:arr];
             //OR
             self.model = [arr copy];
             //OR
             //something else?
          });
      }
  });
}

@end

ありがとうございました!

4

3 に答える 3

1
// you can use any string instead "mythread"
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.mycompany.myqueue", 0);

dispatch_async(backgroundQueue, ^{
   // Send Request to server for Data
    NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:SOME_URL]];

    dispatch_async(dispatch_get_main_queue(), ^{
        // Receive Result here for your request and perform UI Updation Task Here
        if ([data length] > 0) {
           // if you receive any data in Response, Parse it either (XML or JSON) and reload tableview new data
        }
    });    
});
于 2013-10-14T08:08:45.820 に答える
0
  1. このリンクを見てくださいdispatch_asyncとこのhttps://developer.apple.com/library/ios/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.htmlを理解する
  2. これをバックグラウンドで実行するDISPATCH_QUEUE_PRIORITY_BACKGROUND代わりに追加する必要があります。DISPATCH_QUEUE_PRIORITY_DEFAULT

DISPATCH_QUEUE_PRIORITY_DEFAULTあなたを使用することで、タスクが通常のタスクとして分類されました。より高いまたはより低い優先度に変更した場合、キューはそれぞれ他のタスクの前または後にそれを実行します。

于 2013-10-13T22:23:15.357 に答える
0

やったほうがいい:

self.model = arr;

への参照selfはセッターを呼び出します。これにより、その変数内の以前の参照が解放され、参照カウントが追加arrされて、範囲外にならなくなります。ivar に直接アクセスしている場合は、次のようにします。

[model release];
model = [arr retain];
于 2013-10-13T22:27:40.820 に答える