dispatch_async 与 NSOperation 队列

Posted

技术标签:

【中文标题】dispatch_async 与 NSOperation 队列【英文标题】:dispatch_async with NSOperation queue 【发布时间】:2014-03-03 06:05:34 【问题描述】:

我正在使用 NSOperation 队列来解析 url 并在完成后加载 UITableview,这是我的代码,我在 NSOperation 队列中使用 dispatch_async,我的问题是,我可以使用这种代码,这种方法是错误的吗?

 queue = [[NSOperationQueue alloc]init];
 NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
                                                                                     selector:@selector(loadDataWithOperation) object:nil];
      [queue addOperation:operation];

 - (void) loadDataWithOperation 

   __block NSData *data = [[NSData alloc] init];
    dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void)

        NSURL *dataURL = [NSURL URLWithString:[NSString stringWithFormat:@"url"]];
        NSError *err=nil;
        data=[NSData dataWithContentsOfURL:dataURL options:NSDataReadingUncached error:&err];

        dispatch_async(dispatch_get_main_queue(), ^(void)

            NSError *err=nil;

            NSDictionary *response_login;


            if(!err)
            
                [bookingTime removeAllObjects];
                [duration removeAllObjects];
                [guestNumber removeAllObjects];
                [status removeAllObjects];

                response_login = [NSJSONSerialization JSONObjectWithData:data options:0 error:&err];
                 NSArray *TimeSlotList=[[response_login  objectForKey:@"ResultInfo"]objectForKey:@"TimeSlotList"];

                if( [TimeSlotList count]>0 )
                
                    for(NSDictionary *dict in TimeSlotList)
                    

                        [bookingTime addObject:[dict objectForKey:@"BookingTime"]];
                        [duration addObject:[dict objectForKey:@"Duration"]];
                        [status addObject:[NSString stringWithFormat:@"%@",[dict objectForKey:@"IsBlocked"]]];
                         [guestNumber addObject:[dict objectForKey:@"AvailCount"]];


                    


                    [self.view addSubview:bookingDetails];
                    [self.bookingDetails reloadData];
                
                else
                

                    res1.text=@"No available timeslot Found";
                    [self.view addSubview:res];

                
            


        );
    );

【问题讨论】:

你有什么问题? 【参考方案1】:

以这种方式使用 NSOperationQueue 似乎毫无意义。

您似乎也有直接访问实例变量而不是访问器的习惯。您应该使用下划线字符开始所有实例变量,以使任何阅读代码的人都可以看到它。使用实例变量而不是访问器可能会导致很难找到的错误。

【讨论】:

以上是关于dispatch_async 与 NSOperation 队列的主要内容,如果未能解决你的问题,请参考以下文章

将 dispatch_async 与 self 一起使用

主队列上的 dispatch_sync 与 dispatch_async

尝试将 dispatch_async 与 cocos2d 函数一起使用时出错

dispatch_async 和 autoreleasepool

了解 dispatch_async

Autoreleasepool 和 dispatch_async