Tag: objective c blocks

弱自引用的generics

我试图找出一种方法来使用typeof来创build一个self的弱引用在块中使用,以避免保留周期。 当我第一次读到这个时,似乎这个惯例是使用__block typeof(self) bself = self; ,编译但使用__block来避免保留周期不再工作,应该使用__weak 。 然而__weak typeof(self) bself = self; 导致错误: 'typeof(self)'(aka'TUAccountsViewController * const __strong')types已经有保留属性设置 有没有办法使用typeof或其他调用一般创build一个self弱引用?

Objective-C:在inheritance枚举块中继续?

如果我有一个NSArray,并且使用enumerateUsingBlock来遍历数组中的元素,但是在某些情况下,我需要跳过循环体并转到下一个元素,在块中是否存在任何continue等价的内容,或者是否可以直接使用continue ? 谢谢! 更新: 只是想澄清一下,我想要做的是: for (int i = 0 ; i < 10 ; i++) { if (i == 5) { continue; } // do something with i } 我需要的是continue相当于块。

从NSArray执行块?

我只是想,因为你可以把块像对象,如果我创build两个,然后将它们添加到一个NSArray有没有办法从数组中执行它们? int (^Block_001)(void) = ^{ return 101; }; int (^Block_002)(void) = ^{ return 202; }; NSArray *array = [NSArray arrayWithObjects:Block_001, Block_002, nil]; 编辑:更新清晰Per @ davedelong的优秀答案 int (^Block_001)(void) = [^{ return 101; } copy]; int (^Block_002)(void) = [^{ return 202; } copy]; NSArray *array = [NSArray arrayWithObjects:Block_001, Block_002, nil]; [Block_001 release]; [Block_002 release];

在自UIViewController调用的非保留完成中引用self时,weakSelf / strongSelf舞真的有必要吗?

说我在UIViewController子类中有以下方法: – (void)makeAsyncNetworkCall { [self.networkService performAsyncNetworkCallWithCompletion:^{ dispatch_async(dispatch_get_main_queue(), ^{ [self.activityIndicatorView stopAnimating]; } }); }]; } 我知道块内的self引用导致UIViewController实例被块保留。 只要performAsyncNetworkCallWithCompletion不会将该块存储在我的NetworkService的属性(或ivar)上,我是否认为没有保留周期? 我意识到上面的这个结构将导致UIViewController被保留,直到performAsyncNetworkCallWithCompletion完成,即使它是由系统提前发布的。 但它可能(甚至可能?)系统将释放我的UIViewController 在所有 ( iOS 6pipe理UIViewController的支持CALayer内存的方式更改后 )? 如果有一个原因,我必须做的“自我/自我舞蹈”,看起来是这样的: – (void)makeAsyncNetworkCall { __weak typeof(self) weakSelf = self; [self.networkService performAsyncNetworkCallWithCompletion:^{ typeof(weakSelf) strongSelf = weakSelf; if (!strongSelf) { return; } dispatch_async(dispatch_get_main_queue(), ^{ [strongSelf.activityIndicatorView stopAnimating]; } }); }]; } 但是我觉得这很丑陋,如果没有必要,我想避免它。

Objective-C块更好的asynchronous控制stream程

我正在使用AFNetworking对Web服务进行asynchronous调用。 这些呼叫中的一些必须被链接在一起,其中呼叫A的结果由呼叫C使用的呼叫B使用,等等 AFNetworking会在创build操作时处理设置了成功/失败块的asynchronous调用结果: NSURL *url = [NSURL URLWithString:@"http://api.twitter.com/1/statuses/public_timeline.json"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { NSLog(@"Public Timeline: %@", JSON); } failure:nil]; [operation start]; 这会导致嵌套的asynchronous调用块迅速变得不可读。 当任务不相互依赖,而是必须并行执行,执行取决于所有操作的结果时,情况会更加复杂。 似乎更好的方法是利用承诺框架来清理控制stream程。 我遇到了MAFuture,但无法弄清楚如何最好地将其与AFNetworking相结合。 由于asynchronous调用可能有多个结果(成功/失败),并没有返回值,它似乎不是一个理想的契合。 任何指针或想法,将不胜感激。

iOS块和强/弱引用自我

我有一个关于在iOS中对块自我强和弱引用的问题。 我知道在块内引用self的正确方法是在块外创build一个弱引用,然后在块内引用弱引用,如下所示: __weak typeof(self) weakSelf = self; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^ { typeof(self) strongSelf = weakSelf; NSLog(@"%@", strongSelf.someProperty); }); 但是,如果你有嵌套块会发生什么? 这一套引用是否足够了? 或者你需要为每个块新的设置? 例如,以下哪一项是正确的? 这个: __weak typeof(self) weakSelf = self; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^ { typeof(self) strongSelf = weakSelf; NSLog(@"%@", strongSelf.someProperty); dispatch_async(dispatch_get_main_queue(), ^ { strongSelf.view.frame = CGRectZero; }); }); 或这个: __weak typeof(self) weakSelf = self; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^ […]

阻止引用作为Objective-C中的实例variables

我想知道是否有可能在Objective-C中存储对匿名函数(块)的引用作为实例variables。 我知道如何使用委托,目标行动等。我不是在谈论这个。

如何取消NSBlockOperation

我有一个很长的运行循环,我想用NSOperation在后台运行。 我想用一个块: NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ while(/* not canceled*/){ //do something… } }]; 问题是,如何检查是否取消。 该块没有任何参数,当它被块捕获时, operation是零。 有没有办法取消块操作?

主队列上的dispatch_sync与dispatch_async

忍受着我,这是要解释一下。 我有一个如下所示的函数。 上下文:“aProject”是一个名为LPProject的核心数据实体,其中包含名为“memberFiles”的数组,其中包含另一个名为LPFile的Core Data实体的实例。 每个LPFile代表磁盘上的一个文件,我们想要做的就是打开这些文件并parsing它的文本,寻找指向OTHER文件的@import语句。 如果我们find@import语句,我们希望find它们指向的文件,然后通过向表示第一个文件的核心数据实体添加一个关系来将该文件“链接”到这个文件。 由于所有这些都可能需要一些时间在大文件上,我们将使用GCD从主线程执行。 – (void) establishImportLinksForFilesInProject:(LPProject *)aProject { dispatch_queue_t taskQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); for (LPFile *fileToCheck in aProject.memberFiles) { if (//Some condition is met) { dispatch_async(taskQ, ^{ // Here, we do the scanning for @import statements. // When we find a valid one, we put the whole path to the imported […]

相当于addTarget的UIButton块:action:forControlEvents:method?

我环顾四周,但无法在互联网上find这个,也没有在苹果文档中的任何地方,所以我猜测它不存在。 但有没有一个iOS4块等效的API来: [button addTarget:self action:@selector(tappy:) forControlEvents:UIControlEventTouchUpInside]; 我想这可以使用一个类来实现,但宁愿不要自己写这个,因为极度的懒惰:) 像这样的东西会很棒: [button handleControlEvent:UIControlEventTouchUpInside withBlock:^ { NSLog(@"I was tapped!"); }];