我需要知道是否最好使用NSOperation或Block将大量图像加载到UIScrollView中?我创建了所有的Imageview并将每个UIImageView定位在正确的位置进入滚动.
为避免内存警告,我选择一次加载图像.我的想法是创建一种队列并插入要加载到队列中的所有图像.我必须使用块或NSOperation来做到这一点?
multithreading nsoperation grand-central-dispatch ios objective-c-blocks
我的应用程序必须在iOS 3.2上运行,而诸如-addOperationWithBlock之类的方法只能在> 4.0中运行.
但是NSOperationQueue从iOS 2.0开始就可用,所以我想尝试一下"老方法".有没有人知道一个方便的教程,它显示了如何在没有块的情况下使用NSOperationQueue的基础知识?
我正在尝试创建一个NSOperationQueue并为其添加一个NSOperation.后来我不想检查队列是否正在运行并且可能中止它.所有这些都应该从不同的函数中调用.这样做的最佳方法是什么?我会很高兴一个代码示例.谢谢!
我问这个问题关于我的问题以有效的方式显示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]这样的东西.
有没有办法如何userInfo NSDictionary获得一个NSOperation?
基本上我想为NSOperation分配一个ID,以后我想检查一下,如果这个ID已经分配给了NSOperation
- (void)processSmthForID:(NSString *)someID {
for (NSOperation * operation in self.precessQueue.operations) {
if ([operation.userInfo[@"id"] isEqualToString:someID]) {
// already doing this for this ID, no need to create another operation
return;
}
}
NSOperation * newOperation = ...
newOperation.userInfo[@"id"] = someID;
// enqueue and execute
}
Run Code Online (Sandbox Code Playgroud) 我将应用程序上传图像从uiimagepickercontroller实现到服务器.但我想在上传过程中实现取消按钮取消上传.
在上传功能:
[operation setCompletionBlock:^{
ProgressView.hidden = YES;
UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Success" message:@"Uploading successfull." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
[av show];
[av release];
overlayToolbar.userInteractionEnabled = YES;
NSLog(@"response string: %@", operation.responseString); //Lets us know the result including failures
}];
NSOperationQueue *queue = [[[NSOperationQueue alloc] init] autorelease];
[queue addOperation:operation];
Run Code Online (Sandbox Code Playgroud)
并且buttoncancel:
[httpClient.operationQueue cancelAllOperations];
Run Code Online (Sandbox Code Playgroud)
当我按下buttoncancel时,它不会停止上传过程,然后出现alertview"Uploading successful".我不知道为什么不能停止但仍然会出现alertview.alertview你能帮帮我吗?
我正在开发一种快速图像扫描应用程序.
在-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
我试图使用NSOperation和NSOperationQueue从某些服务器下载多个图像.我的主要问题是下面的代码片段和这个链接http://www.dribin.org/dave/blog/archives/2009/05/05/concurrent_operations/之间的区别是什么?我更喜欢第二种解决方案,因为我们对操作有更多的控制,它更清洁,如果连接失败,你可以正确处理它.
如果我尝试使用下面的代码从服务器下载大约300张图片,我的应用程序将有一个相当大的延迟,如果我启动应用程序,并立即进入主屏幕,然后回到应用程序,我会崩溃,因为没有足够的时间让应用再次变得活跃.如果我取消注释[queue setMaxConcurrentOperationCount:1],则用户界面是响应的,如果它进入后台并返回到前台,它将不会崩溃.
但是如果我实现类似于上面链接的东西,我不需要担心设置maxConcurrentOperationCount,默认值很好.一切都是响应,没有崩溃,似乎所有队列都得到了更快的完成.
所以这让我想到第二个问题,为什么[queue setMaxConcurrentOperationCount:1]在我的代码中有如此大的影响?从文档中,我认为将maxConcurrentOperationCount保留为其默认值是正常的,这只是告诉队列根据某些因素决定最佳值应该是什么.
这是我在Stack Overflow上的第一篇文章,所以希望这是有道理的,感谢您的帮助!
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];
}
}];
}
Run Code Online (Sandbox Code Playgroud) 我有执行https请求的问题,如果请求没有任何错误,我从来没有得到消息,这是一个命令行工具应用程序,我有一个允许http请求的plist,我总是看到完成块.
typealias escHandler = ( URLResponse?, Data? ) -> Void
func getRequest(url : URL, _ handler : @escaping escHandler){
let session = URLSession.shared
var request = URLRequest(url:url)
request.cachePolicy = .reloadIgnoringLocalCacheData
request.httpMethod = "GET"
let task = session.dataTask(with: url ){ (data,response,error) in
handler(response,data)
}
task.resume()
}
func startOp(action : @escaping () -> Void) -> BlockOperation{
let exOp = BlockOperation(block: action)
exOp.completionBlock = {
print("Finished")
}
return exOp
}
for sUrl in textFile.components(separatedBy: "\n"){
let url = URL(string: sUrl)!
let queu = …Run Code Online (Sandbox Code Playgroud) nsoperation ×10
ios ×7
iphone ×3
objective-c ×3
afnetworking ×1
concurrency ×1
http ×1
performance ×1
swift3 ×1
xcode ×1