Tag: objective c blocks

脚本animation阻止iOS

我正在尝试制作一系列全屏幕图像的animation。 每个图像将以不同的方式进行animation。 我想将这些animation存储在数据库或plist或其他任何地方,我只是不想让它们硬编码。 animation将会非常简单,图片中的物体会轻微晃动或弹跳,或者您有什么。 我将使用块为对象设置animation,理想情况下,我希望将各个块存储在数据存储中。 我想避免使用单独的脚本语言或类似的东西。 我最好的行动是什么?

如何从iOS的Grand Central Dispatch Queueasynchronous绘制到GLKit的OpenGL ES上下文

我正在尝试将冗长的OpenGL绘制操作移动到GCD队列中,以便在GPU磨合时完成其他工作。 我宁愿用GCD来做这件​​事,而不是把真正的线程join到我的应用程序中。 从字面上来说,我想要做的就是能够 不要在glDrawArrays()调用上阻塞,所以当GL渲染速度非常慢时,其余的UI可以保持响应。 当我们还没有完成glDrawArrays()调用时,请放弃glDrawArrays()调用(不要build立一个刚刚增长和增长的帧队列) 在苹果的网站上,文档说: GCD和NSOperationQueue对象可以在他们select的线程上执行你的任务。 他们可能会专门为这个任务创build一个线程,或者他们可能会重用一个现有的线程。 但无论哪种情况,都不能保证哪个线程执行任务。 对于OpenGL ES应用程序,这意味着: 在执行任何OpenGL ES命令之前,每个任务都必须设置上下文。 访问相同上下文的两个任务可能永远不会同时执行。 每个任务都应该在退出之前清除线程的上下文。 听起来很直接。 为了简单起见,我将从“OpenGL ES”游戏“新build项目”对话框中提供的新版苹果模板开始。 当你实例化它,编译并运行时,你应该看到两个立方体在灰色区域上旋转。 为了这个代码,我添加了一个GCD队列。 从ViewController.m的界面部分开始: dispatch_queue_t openGLESDrawQueue; 然后在ViewController设置viewDidLoad : openGLESDrawQueue = dispatch_queue_create("GLDRAWINGQUEUE", NULL); 最后,我对CADisplayLink最终触发的drawInRect方法进行了非常小的修改: – (void)glkView:(GLKView *)view drawInRect:(CGRect)rect { void (^glDrawBlock)(void) = ^{ [EAGLContext setCurrentContext:self.context]; glClearColor(0.65f, 0.65f, 0.65f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBindVertexArrayOES(_vertexArray); // Render the object with GLKit […]

ios在字典或数组中存储^块?

我可以将^块存储在字典或数组中吗? 我需要听一个服务器通知,我需要提供一个块来处理通知,在我的项目中,几个视图控制器都希望听到通知,所以我做了一个通用的通知pipe理器,它有自己的处理服务器块通知,它有一个代表arrays,所以在经理的块: – (^)(NSString *message){ for (delegate in allDelegates) { delegate.handlerBlock(message); } } 但我可以在块中存储块吗?

Objective-C到Swift的完成处理程序

我目前正在重写一个项目从Objective-C到Swift。 大部分的项目已经完成,但是我在翻译一个有完成处理程序的方法时遇到了问题。 我已经阅读了文档,但是我仍然有问题。 方法是: – (void)start:(void ( ^ ) ( WTStartupConfiguration *configuration ))startupHandler completion:(void ( ^ ) ( BOOL isRunning , NSError *error ))completionHandler 在Objective-C中,我会简单地写为: [self.architectView start:^(WTStartupConfiguration *configuration) { } completion:^(BOOL isRunning, NSError *error) {}}]; 我无法很好地理解Swift中的闭包语法。 任何帮助,将不胜感激!

使对象保持活动状态,直到后台任务完成

我试图实现一个方法,在后台执行一个任务,然后调用主线程上的一个块: + (void)migrateStoreWithCompletionHandler:(MigrationControllerCompletion)completion { MigrationController *controller = [[MigrationController alloc] initWithCompletionBlock:completion]; [controller migrateStore]; } 这是-initWithCompletionBlock:方法: – (id)initWithCompletionBlock:(MigrationControllerCompletion)completion { self = [super init]; if (self) { _completion = [completion copy]; } return self; } 后台工作发生在-migrateStore 。 问题是ARC在[controller migrateStore]之后释放controller 。 因为controller是保持在块上的对象,我不能永远称它。 有没有人有任何build议如何解决这个问题?

NSMutableArray内的块泄漏(ARC)

我有一些块内的操作。 这个操作只是像这样更新一个UIImage : ^(UIImage *image) { self.myImage = image; }]; 我的图像是通过NSURLConnection访问互联网来计算的。 当我从互联网上收到图像时,我会调用NSMutableArray那个块。 到现在为止还挺好。 我的问题是,当我有多个图像具有相同的URL,而不是进行多个调用,我只是添加一个新的块到处理连接的类内的NSMutableArray 。 这样,我只需要打一个电话,就可以更新多个共享URL的图像。 一切正常,问题是,我正在泄漏块。 我将这样的块添加到NSMutableArray : if( (self = [super init]) ) { self.connectionURL=url; self.arrayOfBlocks=[NSMutableArray array]; [arrayOfBlocks addObject:completion]; } return self; 这是连接类被初始化的时候。 这是当我需要添加一个新的块到NSMutableArray (我只添加它,就是这样): [arrayOfBlocks addObject:completion]; 这是当我最终收到回电,并开始执行块: for (MyBlock blockToExecute in arrayOfBlocks) { blockToExecute([UIImage imageWithData:data]); } 问题是这个漏水了。 因为我在ARC环境中,所以无法抵消使用版本或自动发布的情况。 那么有什么解决办法?

为什么在块被复制之前,__blockvariables被移动到堆上?

我知道,一个__blockvariables将被移动到堆栈中,如果一个块访问它被复制。 但是下面的testing代码告诉我,在块的复制之前 , __blockvariables被移到了堆上。 也就是说,这四个输出是:stack => heap => heap => heap,这不是我预期的结果:stack => stack => stack => heap。 有人能把我整理出来吗? __block int x = 0; int *pointerToX = &x; //1. It's on the stack NSLog(@"x's location is on the stack: %p", &x); int (^block)() = ^{ x += 1; return x; }; //2. I think its stack, […]

如何在枚举过程中删除NSMutableArray或NSMutableDictionary中的元素?

我正在使用基于块的枚举类似于下面的代码: [[[rows objectForKey:self.company.coaTypeCode] objectForKey:statementType] enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(id coaItem, NSUInteger idx, BOOL *stop) { // block code here }] 我想在枚举过程中删除一些对象取决于它们的对象值。 我怎么能这样做? 我知道在枚举过程中操作可变数组或字典(NSMutableArray或NSMutableDictionary)通常是不可能的。 什么是实施这个最好的方法? 谢谢!

参考块内的自我

现在我有这样的代码的一部分: __strong MyRequest *this = self; MyHTTPRequestOperation *operation = [[MyHTTPRequestOperation alloc]initWithRequest:urlRequest]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *request, id responseObject) { [this requestFinished:request]; } failure:^(AFHTTPRequestOperation *request, NSError *error) { [this requestFailed:request withError:error]; }]; 我主要这样做,因为其他一些类从这个代码所在的类inheritance,并实现自己的requestFinished和requestFailed。 如果我将自引用更改为__weak,则会出现一些EXC_BAD_ACCESS错误。 有一个__strong引用一切工作正常,但我害怕创build一个保留周期。 请注意,我正在使用ARC。 这段代码是否会创build一个会导致问题的保留周期? 任何简单的解决scheme呢? 任何不同的方法,我可以遵循让inheritance类实现自己的方法来处理响应?

在iPhone模拟器4.3 / XCode 4.2和4.0.2中使用块崩溃的应用程序

任何人在XCode 4.2(狮子)或4.0.2 4.3 iPhone模拟器有麻烦吗? 我有很长时间的工作,testing,并在生产中使用块来指定完成操作的代码。 例如,我使用UIViewanimation来淡出标签顶部的一些文本,如下所示: [UIView animateWithDuration: 0.0 delay: 0.0 options: (UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionTransitionNone) animations: ^{ videoTextLabel1.alpha = 0.0; videoTextLabel2.alpha = 0.0; videoTextLabel3.alpha = 0.0; } completion: ^(BOOL completed) { [self fadeInNextMeditationLine: 0]; }]; 我可以在模拟器中可靠地获得EXEC_BAD_ACCESS – 从来没有在设备上的问题。 在另一个地方,我使用我自己的完成块实施,在用户解散模态视图后采取行动。 ValuePickerController *controller = [[ValuePickerController alloc] initWithNibName: kValuePickerXIBFileName bundle: nil labelText: @"prompt") value: alertSettings.frequency minimumValue: kMinimumFrequency maximumValue: […]