Когда это запускается, мой пользовательский интерфейс зависает. Это в значительной степени из документов:

- (void)doNetworkOperations
{
    [[self networkQueue] cancelAllOperations];

    [self setNetworkQueue:[ASINetworkQueue queue]];
    [[self networkQueue] setMaxConcurrentOperationCount:8];
    [[self networkQueue] setDelegate:self];
    [[self networkQueue] setRequestDidFinishSelector:@selector(requestFinished:)];
    [[self networkQueue] setQueueDidFinishSelector:@selector(queueFinished:)];
    [[self networkQueue] setRequestDidFailSelector:@selector(requestFailed:)];


    ASIHTTPRequest *request01 = [self loadTodaysNews];
    ASIHTTPRequest *request02 =  [self loadFoodItems];
    ASIHTTPRequest *request03 = [self loadFarms];
    ASIHTTPRequest *request04 = [self loadMobileSections];
    ASIHTTPRequest *request05 = [self loadThymeLinks];
    ASIHTTPRequest *request06 = [self loadFoodCategories];
    ASIHTTPRequest *request07 = [self deleteDeletedRecords];


    [[self networkQueue] addOperation:request01];
    [[self networkQueue] addOperation:request02];
    [[self networkQueue] addOperation:request03];
    [[self networkQueue] addOperation:request04];
    [[self networkQueue] addOperation:request05];
    [[self networkQueue] addOperation:request06];
    [[self networkQueue] addOperation:request07];

    [[self networkQueue] go];
}

И вот пример запроса:

- (ASIHTTPRequest *) loadTodaysNews
{   
    NSString* urlString = @"http://xxx.xxx.xxx/ra/NewsItem.json";
    // 0. Setup URL
    if(self.settings.lastNewsTimestamp != nil){
        [NSDateFormatter setDefaultFormatterBehavior:NSDateFormatterBehavior10_4];
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"MMddyyHHmm"];

        urlString=[urlString stringByAppendingFormat:@"?lastmoddate=%@", [dateFormatter stringFromDate:self.settings.lastNewsTimestamp]]; 
        [dateFormatter release];        
    }



    // 1. Fetch
      NSURL* url = [NSURL URLWithString:urlString];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];


    [request setCompletionBlock:^(void) {
        [NSThread detachNewThreadSelector: @selector(spinBegin) toTarget:self withObject:nil];


        NSString *responseString = [request responseString];
        // 3. parse the response
        NSArray *responseDict = [responseString objectFromJSONString];

        for(int i=0;i<responseDict.count;i++){
            NSDictionary *itemDict = (NSDictionary *)[responseDict objectAtIndex:i];


            NSPredicate* predicate =  [NSPredicate predicateWithFormat:@"(extID == %@)", [[itemDict objectForKey:@"id"]description]];
            NSMutableArray * mutableFetchResults = [CoreDataHelper searchObjectsInContext:@"NewsItem" :predicate:@"name" :YES :   self.managedObjectContext];

            NewsItem* item  = nil;
            if(mutableFetchResults == nil || mutableFetchResults.count == 0){
                item = [NSEntityDescription
                                   insertNewObjectForEntityForName:@"NewsItem"
                                   inManagedObjectContext:self.managedObjectContext];

            } else {
                //Edit or Delete
                item = [mutableFetchResults objectAtIndex:0];
            }
            if([[[itemDict objectForKey:@"publish"]description]isEqualToString:@"1"]){
                //edit

                item.name = [itemDict objectForKey:@"name"];
                item.textDescription = [itemDict objectForKey:@"textDescription"];
                if([itemDict objectForKey:@"newsCategory"]!= [NSNull null]){
                    item.section = [[itemDict objectForKey:@"newsCategory"] objectForKey:@"name"];
                }

                item.timeStamp = [NSDate date];
            }else{
                //unpublish/delete
                [self.managedObjectContext deleteObject:item];

            }
        }
        NSError* error = nil;
        if (![self.managedObjectContext save:&error]) {
            NSLog(@"Error %@",error);
        }

        //send a reload message?
        [self.newsViewController.tableView reloadData];
        [NSThread detachNewThreadSelector: @selector(spinEnd) toTarget:self withObject:nil];

    }];

    return request;

//    [request startAsynchronous];
}

Что мне не хватает? Благодарность

1
jimijon 30 Дек 2011 в 17:15
Что делает [NSThread detachNewThreadSelector: @selector(spinBegin) toTarget:self withObject:nil]; делать ?
 – 
CarlJ
30 Дек 2011 в 17:23
Блестяще... так и было. Это был мой исходный код для отслеживания всех процессов до того, как я создал очередь. Теперь все это работает как шарм. Спасибо
 – 
jimijon
30 Дек 2011 в 18:20

1 ответ

Важно: вы должны выполнять действия пользовательского интерфейса только в основном потоке!

Возможно, это может помочь:

[self.newsViewController.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:YES];
3
CarlJ 30 Дек 2011 в 17:26
1
Я не думаю, что это необходимо - блоки завершения ASIHTTPRequest выполняются в основном потоке.
 – 
JosephH
30 Дек 2011 в 19:01