Tag: nsoperationqueue

NSOperation和NSURLConnection神秘

我试图从一些服务器使用NSOperation和NSOperationQueue下载多个图像。 我的主要问题是下面的代码片段和这个链接有什么区别,性能明智吗? 我更喜欢第二种解决scheme,因为我们对操作有更多的控制,它更加清洁,如果连接失败,可以正确处理。 如果我尝试使用下面的代码从服务器上下载大约300张图片,我的应用程序将会有相当大的延迟,如果我启动应用程序,并立即进入主屏幕,然后回到应用程序,我会崩溃,因为没有足够的时间让应用程序再次活跃。 如果我取消注释[queue setMaxConcurrentOperationCount:1],则用户界面是响应的,如果它进入后台并返回到前台,它将不会崩溃。 但是,如果我实现类似于上面的链接,我不需要担心设置maxConcurrentOperationCount,默认值是罚款。 一切都响应,没有崩溃,似乎所有的队列得到更快完成。 所以这带来了我的第二个问题,为什么[queue setMaxConcurrentOperationCount:1]在我的代码中有如此大的影响? 从文档中,我认为将maxConcurrentOperationCount保留为默认值是可以的,而这只是告诉队列根据某些因素决定最佳值。 这是我在堆栈溢出的第一篇文章,所以希望这是有道理的,谢谢你的帮助! NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //[queue setMaxConcurrentOperationCount:1]; for(NSURL *URL in URLArray) { [queue addOperationWithBlock:^{ NSHTTPURLResponse *response = nil; NSError *error = nil; NSData * data = [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:URL] returningResponse:&response error:&error]; if(!error && data) { [data writeToFile:path atomically:YES]; } }]; }

我可以用addOperationWithBlock取消添加到NSOperationQueue的Block吗?

我读了许多文章说“块是未来!!!”。 我想知道它是否涉及到在后台运行操作。 例如,我有一个表格视图,其中有来自networking的图像。 现在我可以使用+[NSOperationQueue addOperationWithBlock:]来获取它们。 当单元格变为可见时,会将操作发送到队列。 但有一种方法可以取消它,一旦细胞滚动屏幕? 或者是唯一的方法来做到NSOperation子类? 使用块很容易,所以我只是在我试图解决这个 NSOperation子类的例子之前问这个问题…

NSOperationQueue vs GCD

在什么情况下,你宁愿使用NSOperationQueue不是GCD? 从我对这两者的有限经验来看,我认为NSOperationQueue基本上可以控制有多less并发操作。 GCD你不能这样做,因为你正在使用一个队列。 除了你可以用多核处理器模拟这个,但是我仍然觉得没有办法控制它。

iOS 3.x中GCD串行调度队列的等价物

苹果的Grand Central Dispatch(GCD)非常棒,但只适用于iOS 4.0或更高版本。 苹果公司的文档说:“串行化操作队列不能提供与Grand Central Dispatch中的串行调度队列完全相同的行为(因为队列不是FIFO,而是由相关性和优先级决定)。 在GCD发布之前支持操作系统版本的同时,达到GCD串行调度队列的正确方法是什么? 或者换一种说法,在想要支持小于4.0版本的iOS应用程序中处理简单后台处理(执行Web服务请求等)的推荐方式是什么?

NSAttributedString initWithData和NSHTMLTextDocumentType在主线程中不会崩溃

调用 NSAttributedString * as = [[NSAttributedString alloc] initWithData:[htmlString dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)} documentAttributes:nil error:nil]; 在主线程以外,导致崩溃 1 0x194b861fc <redacted> 2 0x19801d31c <redacted> 3 0x198010eb4 _os_once 4 0x19801aa2c pthread_once 5 0x195a0858c <redacted> 6 0x195a07c78 WebKitInitialize 7 0x18bb38918 <redacted> 8 0x10020cdf0 _dispatch_client_callout 9 0x10020dcfc dispatch_once_f 10 0x1977f8bd0 <redacted> 11 0x1978009ac <redacted> 12 0x19780bdb8 <redacted> 13 0x1940b259c _NSReadAttributedStringFromURLOrData […]

为什么在处理主线程上的大量任务时,NSOperationQueue比GCD或者performSelectorOnMainThread更快?

例如,我有100次for循环。 并需要更新UIImageView,最后2种方法是一样的慢。 为什么? 他们之间有什么不同? //fastest [[NSOperationQueue mainQueue] addOperationWithBlock:^{ [btnThumb setImage:[UIImage imageWithData:data] forState:UIControlStateNormal]; [scrollView addSubview:btnThumb]; }]; //slowly dispatch_async(dispatch_get_main_queue(), ^ { [btnThumb setImage:[UIImage imageWithData:data] forState:UIControlStateNormal]; [scrollView addSubview:btnThumb]; }); //slowly [btnThumb setImage:[UIImage imageWithData:data] forState:UIControlStateNormal]; [self performSelectorOnMainThread:@selector(testMethod:) withObject:[NSArray arrayWithObjects:scrollView, btnThumb, nil] waitUntilDone:NO]; -(void) testMethod:(NSArray*)objs { UIScrollView *scroll = [objs objectAtIndex:0]; UIButton *btn = [objs lastObject]; [scroll addSubview:btn]; }

dispatch_async中的asynchronousurl请求

我试图在一个特定的函数中实现asynchronousurl请求,我想要完成所有这些请求,然后执行一个特定的操作,但该操作先于请求,即在请求完成之前调用它。 dispatch_queue_t fetchQ = dispatch_queue_create("Featured Doc Downloader", NULL); dispatch_async(fetchQ, ^{ [self myAsyncMultipleURLRequestFunction]; dispatch_sync(dispatch_get_main_queue(), ^{ [self updateUIFunction]; }); }); -(void)myAsyncMultipleURLRequestFunction { for (int i=0; i<count; i++) { NSURLConnection *loginConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; } } 现在在myAsyncMultipleURLRequestFunction完成所有请求之前调用updateUIFunction。 也试过这与NSOperaitonQueue,但不能做我真正想要的。 [_operationQ addOperationWithBlock: ^ { for (int i=0; i<count; i++) { NSURLConnection *loginConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; } […]

保持NSOperationQueue,直到上一个操作完成

我只想执行一些操作,只有在完成前一个操作时才需要开始下一个操作。 我添加的操作将发送asynchronous调用到服务器并接收数据。 我只想在第一次调用服务器完成从服务器接收数据之后才开始下一个操作。 怎么做? {…. PhotoDownloader *pd = [[PhotoDownloader alloc] init]; [GetGlobalOperationQueue addOperation:pd]; } 在PhotoDownloader里我将分配所需的参数,并调用一个全局函数来处理所有的请求 [GlobalCommunicationUtil sendServerReq:reqObj withResponseHandler:self]; 在sendServerReq方法中,我将构造URL请求并将其发送到服务器,此调用是“sendAsynchronousRequest”调用。 PhotoDownloader将具有CommunicationUtil的委托方法。

maxConcurrentOperationCount的NSOperationQueue的默认值

如标题所示,NSOperationQueue的maxConcurrentOperationCount默认值是多less? 它是否设置为1的值?

如何取消用addOperationWithBlock创build的操作?

我正在使用NSOperationQueue的addOperationWithBlock。 从该区块内,我该如何检查是否应该取消操作? 或者访问任何NSOperation属性/方法? [myOperationQueue addOperationWithBlock: ^{ while ( /* long running loop */ ) { // how to determine here if I need to cancel? // for that matter, access any NSOperation properties/methods? } }]; 是更好的方式来做到这一点使用NSBlockOperation?