0

以下のコードは、ASIで使用したものとほぼ同じですが、現在はAFNetworkingを使用しています。私の推測では、メインスレッドでsuccessブロックを実行しているため、低速です。successCallbackQueueを新しいキューに設定しようとしましたが、機能していないようです。それは非常に遅く、これを効率的に行いません。どうすれば高速化できますか、またはバックグラウンドスレッドで実行されていることを確認できますか?

#define kPerPage 10

- (void) pullData {
    NSURL *url = [API homeRecentUrlWithPage:self.currentRecentPage limit:kPerPage];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    dispatch_queue_t requestQueue = dispatch_queue_create("requestQueue", NULL);
    AFJSONRequestOperation *operation;
    operation.successCallbackQueue = requestQueue;
    operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        NSArray* modelArray = [JSON objectForKey:@"models"];

        for (int i = 0; i < [modelArray count]; i++)
        {
            Model *b = [Model alloc];
            b = [b initWithDict:[Model objectAtIndex:i]];
            [self.otherArray addObject:b];
        }
        [_modelTable reloadData];

    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
        NSLog(@"%@", [error userInfo]);
    }];
    [operation start];
}


- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString* identifier = @"ModelTableCell";
    cell = (ModelTableCell *)[tableView dequeueReusableCellWithIdentifier:identifier];
    if (cell == nil) {
        cell = [[ModelTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
        cell.selectionStyle = UITableViewCellAccessoryNone;
    }
    if([indexPath row] == (self.currentRecentPage-1) * kPerPage + 5) {
        NSLog(@"%d aaa", self.currentRecentPage);

        self.currentRecentPage++;
        [self pullData];
    }


    Model *b = [self.models objectAtIndex:[indexPath row]];
    [cell populateWithModel:b];
    return cell;
}
4

1 に答える 1

1

コールバックのキューを正しく設定していないと思います

コールバック キューを操作に割り当てますが、それを上書きする操作を作成します。

// You create the queue
dispatch_queue_t requestQueue = dispatch_queue_create("requestQueue", NULL);

// You declare an operation, but you don't create it.
AFJSONRequestOperation *operation;

// You assign the requestQueue to this uninitialised operation
operation.successCallbackQueue = requestQueue;

// You create the operation here, and it overwrites the requestQueue you have set
operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {

操作を作成した、successCallbackQueue を設定する必要があります。

もう少し追加するために編集されました

そして、私の側でもう少し読んでください。GCD と Mountain Lion または iOS6 アプリでは、ARC を使用すると、キューのメモリ管理が行われます。そのため、メソッド内でキューを宣言し、(successCallbackQueue プロパティが AFNetworking で宣言するように) 値を割り当てるだけのプロパティにそれを割り当てると、キューは解放され、操作はそれを保持しません。 NULL キューを残すと、不正なアクセスが発生します。

したがって、これを修正する方法は、キューへの強力な参照を維持する iVar をコントローラーに持つことです。これにより、操作がキューを保持しなくても、コントローラーが保持するため、あなたの下からクリーンアップされません。 .

于 2012-11-04T05:19:12.213 に答える