我正在为 iPad 构建一个多线程应用程序。我有一个从影片剪辑中提取帧的类,我有一个 UIScrollView 来显示我提取的内容。帧提取器在不同的线程中运行,我只想在提取一定数量的帧后才开始构建 ScrollView 。因此,我创建了这个名为 buffering 的 BOOL 属性,它通过线程进行更新。我的 View Controller 观察到这个属性,只有在这个属性等于 NO 之后我才开始构建 ScrollView。
问题是调用构建方法后,我在 GUI 中看不到任何变化。触摸屏幕后只能看到 ScrollView
这是我在做什么:
创建线程:
[NSThread detachNewThreadSelector:@selector(startReading) toTarget:self withObject:nil];
线程中运行的代码:
-(void) startReadingWithTimeRange:(STimeRange *) timeRange;
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // Top-level pool
//setting the time range for reading the file
[assetReader setTimeRange:timeRange.timeRange];
//start reading
[assetReader startReading];
//declearing about the buffer
CMSampleBufferRef buffer;
int z = 0;
while ( [assetReader status]==AVAssetReaderStatusReading)
{
z++;
//reading buffer
buffer = [assetReaderTrackOutput copyNextSampleBuffer];
if (buffer == NULL) break;
//converting the buffer to UIImage
UIImage *frameImage = imageFromSampleBuffer(buffer);
CMTime time = CMSampleBufferGetOutputPresentationTimeStamp(buffer);
NSLog(@"###duration %lld",time.value/time.timescale);
SFrame *frame = [[SFrame alloc] initWithImage:frameImage andTime:time];
//add it to the frame array
[framesArray addObject:frame];
[frame release];
//check if buffer is not null and needed release
//release the buffer
CFRelease(buffer);
if ([framesArray count] > 100 && self.buffering) {
[self willChangeValueForKey:@"buffering"];
self.buffering = NO;
[self didChangeValueForKey:@"buffering"];
}
}
[pool release];
}
我真的一无所知,非常感谢任何帮助
最佳答案
首先不要调用 willChangeValueForKey 和 didChangeValueForKey 因为你只是让 KVO 通知触发两次,它已经被 self.buffering = NO 触发了;
其次,主线程之外的属性/ivar 更改应该在@synchronized block 内完成,例如:
@synchronized (self) {
self.buffering = NO;
}
您可以交替使用 performSelectorOnMainThread 来调用缓冲方法,例如:
[self performSelectorOnMainThread:@selector(buffering:) withObject:[NSNumber numberWithBool:YES] waitUntilDone:NO];
如果这样做不能解决您的问题,那么您的代码中可能存在其他问题,例如需要在某些 View 或种类上调用 setNeedsDisplay。
你没有说 KVO 通知会发生什么,你不明白这就是你明确尝试发送它的原因吗?
关于objective-c - iPad GUI 仅在触摸后更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8043789/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U
这太简单了,太荒谬了,我在任何地方都找不到关于它的任何信息,包括API文档和Rails源代码:我有一个:belongs_to关联,我开始理解当您没有关联时您在Controller中调用的正常模型方法与您有关联时调用的方法略有不同。例如,我的关联在创建Controller操作时运行良好:@user=current_user@building=Building.new(params[:building])respond_todo|format|if@user.buildings.create(params[:building])#etcetera但我找不到关于更新如何工作的文档:@user
在Ruby(尤其是Rails)中,您经常需要检查某物是否存在,然后对其执行操作,例如:if@objects.any?puts"Wehavetheseobjects:"@objects.each{|o|puts"hello:#{o}"end这是最短的,一切都很好,但是如果你有@objects.some_association.something.hit_database.process而不是@objects呢?我将不得不在if表达式中重复两次,如果我不知道实现细节并且方法调用很昂贵怎么办?显而易见的选择是创建一个变量,然后测试它,然后处理它,但是你必须想出一个变量名(呃),它也会在内存中
如thisanswer中所述,Array.new(size,object)创建一个数组,其中size引用相同的object。hash=Hash.newa=Array.new(2,hash)a[0]['cat']='feline'a#=>[{"cat"=>"feline"},{"cat"=>"feline"}]a[1]['cat']='Felix'a#=>[{"cat"=>"Felix"},{"cat"=>"Felix"}]为什么Ruby会这样做,而不是对object进行dup或clone? 最佳答案 因为那是thedocumenta
升级到OSXYosemite后,我现有的pow.cx安装不起作用。升级到最新的pow.cx无效。通过事件监视器重新启动它也没有成功。 最佳答案 卸载(!)并重新安装解决了这个问题。curlget.pow.cx/uninstall.sh|shcurlget.pow.cx|sh 关于ruby-on-rails-OSXYosemite更新破坏了pow.cx,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/q