Tag: multithreading

从UIView制作UIImage,但不在主线程中

我正在使用众所周知的模式从UIView创建一个UIImage : + (UIImage *) imageWithView:(UIView *)view { UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, [[UIScreen mainScreen] scale]); [view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return img; } 现在,我的问题是我有一个非常复杂的视图,其上有很多子视图,因此这个转换过程大约需要3 +(!!!)秒。 我尝试将它分成另一个在后台运行的线程,它确实提高了性能。 唯一的问题是,我记得,不允许在主线程中创建与UI相关的东西。 我错了,这很好吗? 或者 – 如果我是对的 – 可以做些什么来提高性能? 有没有其他方法可以在不同的线程中使用,但做同样的工作? 非常感谢!

GCD:UIViews上的两个并行animation

我是从这个职位来的,因为讨论太偏离了主要问题。 GCDasynchronous方法的行为不可理解 请帮忙, 我的iPad应用程序有两个并排的TableViews。 这两个不得不从两个不同的Web服务实时加载数据。 我想有两个线程 – 每个专用于一个tableview。 由于dispatch_get_main_queue只能给我一个序列号,所以我不能实时更新表。 而且,它也涉及到更新UI元素,我只需要在主队列上进行线程化,这是串行化 – 并行获取是不可能的。 有人可以请添加您的想法,让我怎么可以有两个独立的线程同时运行和更新UI元素?

如何从后台线程返回数据?

我有一个方法,应该返回一个数组,这是一个后台线程填充。 我想等到return语句,直到数组完全填充。 我该怎么做? 我知道如何处理没有返回types的数据,但我想调用这个函数,并获得填充数组。 示例(这里数组结束为空,因为它在数组填充之前返回 – 我想做一些事情来返回填充的数组): -(NSArray*)fetchSomeArray{ __block NSArray *arrayToReturn; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,(unsigned long)NULL), ^(void) { NSArray *someArray = …; // getting some array from database arrayToReturn = [NSMutableArray new]; for(int i=0;i<someArray.count;i++){ [arrayToReturn addObject:…]; } }); return arrayToReturn; }

运行时错误:__NSAutoreleaseNoPool():…自动释放没有到位的池 – 只是泄漏

当我编译我的iOS项目时,出现如下错误的错误列表。 2011-08-25 12:32:44.016 rtsp[55457:6003] *** __NSAutoreleaseNoPool(): Object 0x64095a0 of class __NSArrayM autoreleased with no pool in place – just leaking 看起来是因为以下function – (void) start { //Existing code session = [[RTSPClientSession alloc] initWithURL: [NSURL URLWithString: @"rtsp://video3.americafree.tv/AFTVComedyH2641000.sdp"]]; [session setup]; NSLog(@"getSDP: –> %@",[ session getSDP ]); NSArray *array = [session getSubsessions]; for (int i=0; i < [array count]; […]

合并到父/主上下文后,子上下文对象变空

我正在使用核心数据的multithreading应用程序。 具有讽刺意味的是,当我得知Core Data不是线程安全的时候,我认为应用程序已经接近完成了…因此,我现在添加了多上下文,而不是从Xcode模板获得的单一上下文一直工作到目前为止,真的,但是这比我所猜测的技巧更有运气) 我试图使用与父/子上下文,这将适合我想要做的,但是当我在我的子上下文中插入有效的数据/属性的有效的对象的iOS 5.0的方法,他们都成为零,或0(取决于属性types)在父上下文中。 我注意到有类似的post,但没有任何答案。 家长MOC获取来自儿童MOC的空数据的变化 NSManagedObject值是正确的,然后在从父对象到子对象NSManagedObjectContext合并更改时不正确 这里有一些代码来获得这个想法。 我有一个单独的pipe理器,用户界面用来“做东西”,然后在任务完成时使用委托或callback。 那个经理又有一个模型pipe理者来处理持久的数据pipe理,还有一些其他的comm-managers跟web / REST-API等等。 – (void) doSomeStuff:(NSString*)someParam callbackObject:(NSObject*)object onSuccess:(SEL)successSelector onFailure:(SEL)failureSelector { //Kick as an async thread since we don't want to disturb the UI dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, (unsigned long)NULL), ^(void) { //Ask model manager for a nice context to work with… //NOTE; All contexts (private ones) are stored […]

如何回滚临时上下文的变化?

我创build一个像这样的temporaryContext: let temporaryContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType) temporaryContext.parentContext = Utility.managedObjectContext() temporaryContext.performBlockAndWait({ // .. here I have done some changes on temporaryContext let success = temporaryContext.save(nil) //GUI get updated, GUI use MAIN context }) 我想回滚更改,所以我这样做: temporaryContext.performBlockAndWait({ temporaryContext.rollback() let success = temporaryContext.save(nil) //GUI not get restored to the default variable }) 但它没有效果,父上下文不会回滚,为什么?

在同一个数据库上同时使用基于core-data和sqlite c的api

AFAIK CoreData可以configuration为在持久性存储中使用sqlite。 所以核心数据不提供使用SQL查询的方式。 所以core-data在后台有sqlite db。 同时使用基于Core-Data和Sqlite c的api访问相同的数据库是否安全? 会导致任何数据损坏是sqllite或任何线程问题。 为什么我要使用任何包装如FMDB或基于C的API是使用SQL查询来查询复杂的数据 请澄清我。

如何在glkview中使用dispatch_async?

我正在学习如何在我的iOS Opengl-es应用程序中使用线程。 我试图修改opengl游戏模板代码: – (void)glkView:(GLKView *)view drawInRect:(CGRect)rect { 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 [self.effect prepareToDraw]; glDrawArrays(GL_TRIANGLES, 0, 36); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ sleep(1); dispatch_async(dispatch_get_main_queue(), ^{ // Render the object again with ES2 glUseProgram(_program); glUniformMatrix4fv(uniforms[UNIFORM_MODELVIEWPROJECTION_MATRIX], 1, 0, _modelViewProjectionMatrix.m); glUniformMatrix3fv(uniforms[UNIFORM_NORMAL_MATRIX], 1, 0, _normalMatrix.m); glDrawArrays(GL_TRIANGLES, 0, 36); }); }); } […]

目标C块 – 如何提取块数据(Facebook SDK)

我现在正在忍受几个小时的痛苦。 我正尝试使用Facebook SDK 3.5 for iOS从Facebook API检索数据。 当我使用方法startWithCompletionHandler()发出一个请求时,它似乎没有调度一个新的线程,因为它等待整个函数结束,只有在这之后块内容才会被执行。 所以我不能读取类的其他区域中的userData内容。 我曾经试过信号量,但似乎总是陷入僵局。 userData是全局的。 FBRequest *request = [FBRequest requestForMe]; // Send request to Facebook [request startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) { if (!error) { // result is a dictionary with the user's Facebook data userData = (NSDictionary *)result; NSLog(@"Block return: %@",userData[@"id"]); } else{ NSLog(@"Facebook Initialization error: %@", […]

使用GCD的NSOperation,确保所有在同一个线程上

我有一个'并发' NSOperation ,在它的工作过程中,它使用了一些内部使用GCD的控制器类。 当这些控制器类返回完成块时,完成块位于另一个线程上。 我知道我可以将当​​前线程存储在操作启动方法中,然后运行performSelectorOnThread:但理想情况下,我想将完成包装在GCD块中,并在开始操作时将其分派到相同的线程中。 这甚至可能与GCD,因为我只能指定一个队列分派。 把这个工作带回到开始运行的同一个线程上的最好方法是什么? 除了我已经build议的,除非这是最好的方法。