RemoteImageDownloader *imgView = (RemoteImageDownloader*)[cell viewWithTag:1];
if (imgView == nil)
{
imgView = [[RemoteImageDownloader alloc] initWithFrame:CGRectMake(0.0, 0.0, 50.0, cell.frame.size.height)];
imgView.tag = 1;
[cell.contentView addSubview:imgView];
}
imgView.image = nil;
imgView.backgroundColor = [UIColor grayColor];
imgView.opQueue = self.opQueue;
//[imgView performSelector:@selector(DownloadRemoteImageforURL:withCachingOption:) withObject:[_marrImgUrl objectAtIndex:indexPath.row]];
if ([self checkDocDirectoryforFileName:[[_marrImgUrl objectAtIndex:indexPath.row] lastPathComponent]])
{
[imgView setImage:[UIImage imageWithData:[self checkDocDirectoryforFileName:[[_marrImgUrl objectAtIndex:indexPath.row] lastPathComponent]]]];
}
else
{
[imgView DownloadRemoteImageforURL:[_marrImgUrl objectAtIndex:indexPath.row] withCachingOption:NSURLRequestReloadRevalidatingCacheData isNeedtoSaveinDocumentDirectory:YES];
}
-(void)DownloadRemoteImageforURL:(NSString*)strURL withCachingOption:(NSURLRequestCachePolicy)urlCachePolicy isNeedtoSaveinDocumentDirectory:(BOOL)isNeedSave
{
ImageLoader *subCategoryImgLoader = [[[ImageLoader alloc] initWithUrl:[NSURL URLWithString:strURL]] autorelease];
subCategoryImgLoader.target = self;
subCategoryImgLoader.didFinishSelector = @selector(imageDownloadDidFinishwithData:andOperation:);
subCategoryImgLoader.didFailSelector = @selector(imageDownloadfailedwithErrorDesc:andOperation:);
[self.opQueue setMaxConcurrentOperationCount:2];
if ([self.opQueue operationCount] > 0)
{
NSOperation *lastOperation = [[self.opQueue operations] lastObject];
[subCategoryImgLoader addDependency:lastOperation];
}
[self.opQueue addOperation:subCategoryImgLoader];
if (_actIndicatorView)
{
[_actIndicatorView removeFromSuperview], _actIndicatorView = nil;
}
_actIndicatorView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
_actIndicatorView.tag = 100;
_actIndicatorView.center = self.center;
[self addSubview:_actIndicatorView];
[_actIndicatorView startAnimating];
}
在上面的代码ImageLoader
中是NSOperation
的子类。当我检查操作计数时,虽然我正在添加操作,但我得到零。如果我犯了任何错误,请告诉我。我没有得到我所犯的错误所以我得到的操作数为零。
我创建了队列实例,它只创建了一次,我使用相同的实例,而不是一次又一次地创建。添加任何操作后,它显示它有一个操作,但是当我要添加另一个操作时,我得到零计数。
RemoteImageDownloader
是UIImageView
的子类。我在UIViewcontroller
。
希望现在很容易理解我在做什么。
现在我评论了一行[self.opQueue setMaxConcurrentOperationCount:2];
。现在它正在获得操作计数。谁能告诉我为什么这么做?
答案 0 :(得分:1)
的最常见原因
“我正在向我的对象的属性y发送消息x,但它返回0并且它不应该”
是您没有为该属性设置值。即在您的情况下,self.opQueue
为nil
。
修改 我们已将此问题排除在外。但是,以下内容仍然具有相关性。
话虽如此,您也有竞争条件,因为操作计数可能会在您的测试大于0之间发生变化并添加依赖项(例如,如果操作完成)。
你应该做这样的事情:
NSOperation* lastOp = [[self.opQueue operations] lastObject];
if (lastOp != nil)
{
[subCategoryImgLoader addDependency:lastOp];
}
operationCount的文档包含
此方法返回的值反映队列中对象的瞬时数量,并在操作完成时进行更改。因此,在您使用返回值时,实际操作数可能会有所不同。 因此,您应该仅将此值用于近似指导,并且不应将其用于对象枚举或其他精确计算。
(我的大胆)
我怀疑当你将max操作设置为2时发生的事情是,当你第二次回到你的代码时,队列上确实没有任何操作。