我有一个应用程序,我在后台重复调用方法.我通过以下步骤实现了这一点:
以下是我使用的代码:
- (void) applicationDidFinishLaunching:(NSNotification *)notification
[NSApplication detachDrawingThread:@selector(refreshUserIdPassword) toTarget:self withObject:nil];
}
-(void)refreshUserIdPassword
{
[self getAllUserIdsPasswordsContinousely];
[NSThread sleepForTimeInterval:180];
[self refreshUserIdPassword];
}
Run Code Online (Sandbox Code Playgroud)
我已经读过NSThread不是执行后台任务的最佳方法,并且在cocoa中提供了其他类,例如 - NSOperationQueue和GCD,它应优先于NSThread来执行异步任务.所以我试图使用替代类来实现上面指定的功能.
问题是 - 虽然我能够使用这些类执行异步任务,但我无法使用这些类执行重复性任务(如我的情况).
有人可以对此有所了解并引导我走向正确的方向吗?
我正在尝试创建一个NSOperationQueue并为其添加一个NSOperation.后来我不想检查队列是否正在运行并且可能中止它.所有这些都应该从不同的函数中调用.这样做的最佳方法是什么?我会很高兴一个代码示例.谢谢!
我正在阅读Apple的文档Concurrent Programming Guide,我认为OperationQueue是一系列操作.该文件说我们在大多数情况下都没有在NSOperationQueue中使用锁.
题
如何使用NSOperationQueue实现读写任务?
何时在NSOperationQueue中使用锁?
我问这个问题关于我的问题以有效的方式显示photolibrary图像iPhone和高效的UITableView"cellForRowIndexPath"方法来绑定PhotoLibrary图像.
所以我想请求答案不重复到这个没有阅读以下细节:)
我们来讨论这个问题,
我已经详细研究了上面提到的问题,我从这里找到了关于操作队列的文档.
所以我创建了一个示例应用程序,通过ALAsset块使用操作队列显示七个照片库图像.
以下是示例应用程序详细信息.
步骤1:
在NSOperationalQueueViewController viewDidLoad方法中,我已将所有照片库ALAsset URL检索到名为的数组中urlArray.
第2步:
将所有URL添加到之后urlArray, if(group!= nil)条件将为false assetGroupEnumerator,因此我创建了一个NSOperationQueue,然后通过for循环创建了七个UIImageView 并NSOperation使用相应的图像视图和URL创建了我的子类对象为每一个并将它们添加到NSOperationQueue.
在这里查看我的NSOperation子类.
在这里查看我的实现(VierwController)类.
我们来讨论这个问题吧.
它不会始终显示所有七个图像.一些图像丢失了.丢失的顺序多次改变(一次不显示第六和第七次,另一次不显示第二次和第三次).控制台日志显示无法找到照片图片编号.但是,URL已正确记录.
您可以在此处查看日志详细信息.
我班上有错吗?
另外,当我浏览上面提到的操作队列文档时,我已经阅读过了NSBlockOperation.我是否需要实现NSBlockOperation而不是NSOperation在处理ALAsset块时?
该NSBlockOperation说明称
您原样使用的类是同时执行一个或多个块对象.因为它可以执行多个块,所以块操作对象使用组语义进行操作; 只有当所有关联的块都已完成执行时,操作本身才被认为已完成.
如何NSBlockOperation针对我的示例应用程序实现with ALAsset块?
我已经完成了Stack …
iphone nsoperation nsoperationqueue nsblockoperation alassetslibrary
有没有办法从同一个nsoperation获取nsoperation所在的"父"操作队列?像[self getCurrentOperationQueue]这样的东西.
在创建NSOperation并将其放入NSOperationQueue时,我从未看到调用main().只有start()被调用.我真的没有做任何奇特的事.作为一个简单的测试,我写了这个:
NSOperationQueue *testOperationQueue = [[NSOperationQueue alloc] init];
MyTestOperation *testOperation = [[MyTestOperation alloc] init];
[testOperationQueue addOperation:testOperation];
Run Code Online (Sandbox Code Playgroud)
在MyTestOperation.m中:
- (void)main
{
NSLog(@"testing if main is getting called");
}
- (void)start
{
NSLog(@"testing if start is getting called");
}
Run Code Online (Sandbox Code Playgroud)
MyTestOperation.h看起来像这样:
#import <Foundation/Foundation.h>
@interface MyTestOperation : NSOperation
@end
Run Code Online (Sandbox Code Playgroud)
我错过了一些明显的东西吗
[编辑注意:我实际上是指非并发,而不是并发(如前一个标题所述).
我创建了一个NSOperation目标是从20个URL下载一些图像(如20).所以在这里NSOperation我创建20 AFImageRequestOperation添加它们NSOperationQueue并调用-waitUntilAllOperationsAreFinished队列.
问题是,它不等待,它立即返回.这是代码
- (void)main {
NSArray *array = [I have the 20 links stored in this array];
self.queue = [[NSOperationQueue alloc]init];
self.queue.maxConcurrentOperationCount = 1;
for (int i = 0; i < array.count; i++) {
NSURL *url = [NSURL URLWithString:[array objectAtIndex:i]];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFImageRequestOperation *op = [AFImageRequestOperation imageRequestOperationWithRequest:request imageProcessingBlock:^UIImage *(UIImage *image) {
return image;
} success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {
// SUCCESS BLOCK (not relevant)
} …Run Code Online (Sandbox Code Playgroud) cocoa-touch objective-c nsoperation nsoperationqueue afnetworking
我正在开发一种快速图像扫描应用程序.
在-captureOutput:didOutputSampleBuffer:fromConnection:方法中,我拿起CVPixelBuffer并将它们添加到NSOperation子类中.该NSOperation取缓冲,并将其转化为保存在文件系统中的图像.返回
的-isConcurrent方法是NSOperationYES.创建操作后,添加到NSOperationQueue.
除了影响扫描帧速率的一个问题外,一切运行正常.
使用时间分析器我发现一些NSOperation运行在我创建的AVCaputureVideoOutput委托的同一个线程上:
dispatch_queue_t queue = dispatch_queue_create("it.CloudInTouchLabs.avsession", DISPATCH_QUEUE_SERIAL);
[dataOutput setSampleBufferDelegate:(id)self queue:queue];
Run Code Online (Sandbox Code Playgroud)
当一个操作在AV会话队列的同一个线程上运行时,它会影响帧速率,它只发生在它们中的一些,可能GCD正在决定在活动线程上调度.
我发现解决该问题的唯一方法是创建一个单独的线程并将其传递给单个操作,强制它们在其上运行.
还有另一种方法,强制在不同的线程上运行操作吗?
[编辑]
按照@impcc的建议我做了一些测试.
即使有些不一致,结果也很有趣.
测试平台是一个通过MBP与调试模式连接的iPhone 5,具有16GB的RAM四核i7.会话使用RosyWriter apple示例代码中的算法测试了60fps的输出.
AVSession队列同步针对高优先级队列
26 fps,有时队列的线程与其中一个操作共享.委托方法内部的时间平均为0.02秒
14 fps,只为操作创建一个线程,如果在该线程上没有调用main方法,则将强制启动该特定线程.这个线程创建一次并使用虚拟端口保持活动状态..代理内部的时间为0.008.
AVSession队列并发目标为高优先级队列
13.5 fps,有时队列的线程与其中一个操作共享.委托方法内部所花费的时间平均为0.02秒,与具有同步队列的对应物相等.
14 fps,只为操作创建一个线程,如果在该线程上没有调用main方法,则将强制启动该特定线程.这个线程创建一次并使用虚拟端口保持活动状态.代表内部的时间是0.008.
结论
并发或串行队列似乎没有太大的区别,但是对我而言并发是不正确的,因为我需要采取时间戳来保留单个图片的序列.让我感到惊讶的事实是使用ad-hoc线程的帧丢弃,即使委托方法内部所花费的时间相当少,帧速率也会下降大约10fps.只是信任GCD,帧速率更好,但委托方法需要2次以上才能完成,这可能是因为有时AV队列也被nsoperations使用.
我无法理解为什么委托内部的时间似乎与fps无关.不应该越快越好?
通过进一步的研究,似乎在添加并可能在队列中执行操作的过程中窃取时间si.
multithreading nsoperation nsoperationqueue grand-central-dispatch ios
我想执行一些操作,只有在完成上一个操作后才需要启动下一个操作.我正在添加的操作将向服务器发送异步调用并接收数据.我想在第一次调用服务器完成从服务器接收数据后才开始下一个操作.怎么做?
{....
PhotoDownloader *pd = [[PhotoDownloader alloc] init];
[GetGlobalOperationQueue addOperation:pd];
}
Run Code Online (Sandbox Code Playgroud)
在PhotoDownloader中,我将分配所需的参数并调用处理所有请求的Global函数
[GlobalCommunicationUtil sendServerReq:reqObj withResponseHandler:self];
Run Code Online (Sandbox Code Playgroud)
在sendServerReq方法中,我将构造URL请求并将其发送到服务器,此调用是"sendAsynchronousRequest"调用.PhotoDownloader将具有CommunicationUtil的委托方法.
为什么NSURLSession在创建和恢复NSURLSessionTask后操作队列为空?
有没有办法判断NSURLSession是否有待处理的任务?
目标是等待多个任务完成,但这不起作用:
NSURLSessionUploadTask *uploadTask = [self.session uploadTaskWithStreamedRequest:request];
[uploadTask resume];
// this prints "0"
NSLog(self.session.delegateQueue.operationCount)
// this returns immediately instead of waiting for task to complete
[self.session.delegateQueue waitUntilAllOperationsAreFinished];
Run Code Online (Sandbox Code Playgroud) nsoperationqueue ×10
nsoperation ×6
objective-c ×6
ios ×5
afnetworking ×1
cocoa ×1
cocoa-touch ×1
iphone ×1
nsthread ×1
nsurlsession ×1
xcode ×1