2013-10-17 106 views
0

我在我的代碼是這樣的:核心數據,通知在主線程

- (id)init 
{ 
    self = [super initWithNibName:nibName bundle:nil]; 
    if (self) { 
     [[NSNotificationCenter defaultCenter] addObserver:self 
               selector:@selector(userDataDidUpdate) 
                name:NSManagedObjectContextDidSaveNotification 
                object:[UserData managedObjectContext]]; 
    } 
    return self; 
} 

- (void)userDataDidUpdate 
{ 
    // notification received... 
} 

,並在其他類(CoreData經理)我這樣做是這樣的:

[[UserData managedObjectContext] performBlock:^{ 

        NSError *error; 
        if (![[UserData managedObjectContext] save:&error]) 
        { 
         // handle error 
        } 

        isSyncing = NO; 
        [[NSNotificationCenter defaultCenter] postNotificationName:NDUserDataSyncDidUpdateLocalData object:nil]; 

        }]; 

的問題是我發送通知在託管的objectContext的performBlock,它不是主線程。我如何在主線程中的performBlcok內發送通知?

謝謝

+0

沒有使用'NSNotificationCenter'來進行跨線程通知。如果您在一個線程中發帖,所有其他線程都會收到通知。 – rckoenes

+0

@rckoenes但蘋果表示我們應該在同一個線程中發佈並接收通知,不是嗎?我可以在後臺線程中發佈通知並在主線程中接收它嗎?如果是的話,這是一個很好的做法? – samir

回答

0

這兩個片段是如何相關的?有不同的通知註冊/發送。

無論如何,你可以做到以下幾點:

dispatch_async(dispatch_get_main_queue(), ^{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:NDUserDataSyncDidUpdateLocalData object:nil];   
}); 

附:我希望你用dealloc方法從通知中心刪除觀察者。

+0

是的。感謝您的回答。 – samir

0

它與GCD簡單,只是包裝它像這樣:

dispatch_sync(dispatch_get_main_queue(), ^{ 
    [[NSNotificationCenter defaultCenter] postNotificationName:NDUserDataSyncDidUpdateLocalData object:nil]; 
}); 

注意我用了dispatch_sync這裏,而不是dispatch_async,因爲你通常希望您的通知被處理完畢,從調用返回到前postNotificationName:...