2014-12-19 31 views
0

在我的情況下,我提出了一個containerViewController由幾個UIViewControllers組成。Reactive cocoa:在UIViewController被dealloc後停止RACSignal

其中之一,控制器A,將每隔10秒向服務器發送請求以獲取數據。我用了一個RACSignal做到這一點:

[[[RACSignal interval:10 onScheduler:[RACScheduler mainThreadScheduler]] takeUntil:self.rac_willDeallocSignal] subscribeNext:DoSomeThing];

但當containerViewController從RootViewController的駁回,信號仍然每10秒發射,意味着控制器A不叫的rac_willDeallocSignal。如何修復?

謝謝!

+0

您必須提供更多代碼來識別問題。一個候選人是「DoSomething」塊。它捕獲什麼? – 2014-12-19 07:51:43

+0

Hi @DaveLee,DoSomeThing塊捕獲到一個單獨的'AFHTTPSessionManager'返回一個執行這個工作的信號,就像'[[self.clientManager getData] doError:subscribeNext:]' – 2014-12-19 08:45:42

回答

2

區間信號是無限的,它永遠不會完成。因此,在訂閱塊中強烈捕獲的任何對象也將無限期地生存,因此它們不會執行任何操作。有兩種方法可以解決此問題:

  1. 捕獲目標弱
  2. 明確處置訂閱

第一種情況是最好的。在這種情況下,您可以在區塊外使用@weakify(self),在區塊內使用@strongify(self)

第二種選擇更多的是笨拙的粗暴方法。我不會推薦它。

請參閱RAC的Memory Management

+0

實現了第一個解決方案,但仍然無法工作,然後我使'containsViewController'在解僱時發佈通知並且它可以工作! – 2014-12-19 09:49:55

+0

代碼:'[[[RACSignal interval:10 onScheduler:[RACScheduler mainThreadScheduler]] takeUntil:[[NSNotificationCenter defaultCenter] rac_addObserverForName:kSystemQuitNotification object:nil]] subscribeNext:DoSomething]' – 2014-12-19 09:52:27

+0

很高興您能夠獲得某些工作。儘管如此,你的解決方案並不理想。如果再次遇到它,您可能需要弄清楚如何打破保留週期,而不是到處使用通知方法。 – 2014-12-19 16:39:31

5

也許現在回答這個問題爲時已晚,但對於那些正在尋找解決方案的人來說可能會有幫助。

我已經解決了類似的問題,當UIViewController將消失,並在間隔信號中使用該信號作爲takeUntil:時,創建單獨的信號。代碼如下所示:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    RACSignal *rac_viewWillDisappear = 
     [self rac_signalForSelector:@selector(viewWillDisappear:)]; 
    [[[RACSignal interval:10 onScheduler:[RACScheduler mainThreadScheduler]] 
     takeUntil:rac_viewWillDisappear] subscribeNext:^(id x) { 
      //Do what you need 
    }]; 
} 
+0

Thx它是我需要的! – Bimawa 2015-12-23 07:30:52

相關問題