Tag: objective c block

typedef-ing块如何工作

在C / Obj-C中,我们做这样的typedef int MYINT; 这很清楚。 为block执行typedef – typedef void (^MyBlock) (int a); 现在,我们可以使用MyBlock 。 不应该像 – typedef void (^MyBlock) (int a) MyBlock; 类似于#define ? 语法是如何工作的?

我如何validation我在给定的GCD队列上运行而不使用dispatch_get_current_queue()?

最近,我需要一个函数来保证特定串行调度队列上给定块的同步执行。 有可能这个共享函数可以从已经在那个队列上运行的东西中调用,所以我需要检查这种情况,以防止从同步调度到同一队列的死锁。 我使用如下代码来做到这一点: void runSynchronouslyOnVideoProcessingQueue(void (^block)(void)) { dispatch_queue_t videoProcessingQueue = [GPUImageOpenGLESContext sharedOpenGLESQueue]; if (dispatch_get_current_queue() == videoProcessingQueue) { block(); } else { dispatch_sync(videoProcessingQueue, block); } } 这个函数依赖于使用dispatch_get_current_queue()来确定这个函数正在运行的队列的身份,并将其与目标队列进行比较。 如果有一个匹配,它知道只是在没有派发到该队列的情况下内联运行该块,因为该函数已经在其上运行。 我曾经听说过是否使用dispatch_get_current_queue()来进行比较是正确的,我在头文件中看到了这个字眼: build议仅用于debugging和logging目的: 代码不能对返回的队列做任何假设,除非它是全局队列或代码本身创build的队列之一。 如果该队列不是由dispatch_get_current_queue()返回的队列,则代码不能假定队列上的同步执行是安全的。 此外,在iOS 6.0(但尚未山狮),GCD标头现在标记为不推荐使用此function。 这听起来像我不应该以这种方式使用这个函数,但我不知道我应该用什么来代替它。 对于像上面那样针对主队列的函数,我可以使用[NSThread isMainThread] ,但是如何检查我是否在我的自定义串行队列中运行,以便可以防止死锁?

在dispatch_async函数中使用weak self

我读了很多关于在dispatch_async里面使用__weak self的post,现在我有点困惑了。 如果我有 : self.myQueue = dispatch_queue_create("com.biview.core_data", NULL); dispatch_async(self.myQueue, ^(void){ if (!self.var1) { self.var1 = …; } dispatch_async(dispatch_get_main_queue(), ^(void) { if ([self.var2 superview]) { [self.var2 removeFromSuperview]; } [self.Label setText:text]; }); }); 我是否需要使用__weak self 。 因为我在某些情况下读到dispatch_async不需要__weak self 。 在这里看最后的评论

无法访问dispatch_async中的全局variables:“Variable is not Assignable(missing _block type specifier)”

在我的dispach_async代码block我无法访问global variables 。 我得到这个错误Variable is not Assignable (missing _block type specifier) 。 NSString *textString; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, (unsigned long)NULL), ^(void) { textString = [self getTextString]; }); 任何人都可以帮我找出原因吗?

为什么我们不能在当前队列上使用dispatch_sync?

我遇到了一个场景,我有一个委托callback可能发生在主线程或另一个线程,我不知道哪些,直到运行时(使用StoreKit.framework )。 我还有需要在函数执行前需要更新的UI代码,所以我最初的想法是有这样一个函数: -(void) someDelegateCallback:(id) sender { dispatch_sync(dispatch_get_main_queue(), ^{ // ui update code here }); // code here that depends upon the UI getting updated } 当它在后台线程上执行时效果很好。 但是,当在主线程上执行时,程序会发生死锁。 这一点对我来说似乎很有趣,如果我阅读dispatch_sync文档,那么我会期望它完全执行该块,而不必担心将其安排到runloop中,如下所述: 作为优化,该函数尽可能地调用当前线程上的块。 但是,这并不是什么大不了的事情,它只是意味着更多的打字,这使我有了这种方法: -(void) someDelegateCallBack:(id) sender { dispatch_block_t onMain = ^{ // update UI code here }; if (dispatch_get_current_queue() == dispatch_get_main_queue()) onMain(); else dispatch_sync(dispatch_get_main_queue(), onMain); } 但是,这似乎有点倒退。 […]

AFNetworking可以同步返回数据(块内)吗?

我有一个使用AFJSONRequestOperation的函数,我只希望成功后返回结果。 你能把我指向正确的方向吗? 我仍然有点无知与块和AFNetworking具体。 -(id)someFunction{ __block id data; AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id json){ data = json; return data; // won't work } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error){ }]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperation: operation]; return data; // will return nil since the block doesn't "lock" the […]