0

我有一个表视图控制器,它应该填充来自封装在store类中的数组的数据。该表需要通过该方法知道每个部分中有多少行table:numberOfRowsInSection:。在这个方法中,我需要返回我的实例中的数组的大小store。我最初是通过做store一个单例来做到这一点的,但被告知这是低效的,使用 NSNotificationCenter 会更好。

据我所知,NSNotificationCenter 所做的只是在另一个对象发布特定通知时触发某些对象中的方法。如何使用 NSNotificationCenter 将数组的大小发送到我的表视图控制器?

4

3 回答 3

2

你可以这样做:

...
// Send 
[[NSNotificationCenter defaultCenter] postNotificationName: SizeOfRrrayNotification
                                                    object: [NSNumber numberWithInteger: [array count]]];

...
// Subscribe
[[NSNotificationCenter defaultCenter] addObserver: self
                                         selector: @selector(sizeOfArray:)
                                             name: SizeOfRrrayNotification
                                           object: nil];

// Get size
- (void) sizeOfArray: (NSNotification*) notification
{
    NSNumber* sizeOfArray = (NSNumber*) notification.object;
    NSLog(@"size of array=%i",  [sizeOfArray integerValue]);
}
于 2013-06-24T03:39:11.627 回答
0

您计算数组大小的方法:

<------通知发送方---------->

-(void)sizeOfArray{
   int size = [myArray count];
   NSMutableString *myString = [NSMutable string];
   NSString *str = [NSString stringwithFormat:@"%d",size];
   [myString apprndString:str];

//It is to be noted that NSNotification always uses NSobject hence the creation of mystring,instead of just passing size

   [[NSNotificationCenter defaultCenter] postNotificationName:@"GetSizeOfArray"      object:myString];
}

现在,一旦您发布了通知,请将其添加到您发送数据的控制器的 viewDidLoad 方法中

<------通知接收方---------->

-(void)viewDidLoad{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(get_notified:) name:@"GetSizeOfArray"  object:nil];

//The selector method should always have a notification object as its argument

 [super viewDidLoad];

}


- (void)get_notified:(NSNotification *)notif {
    //This method has notification object in its argument

    if([[notif name] isEqualToString:@"GetSizeOfArray"]){
       NSString *temp = [notif object];
       int size = [temp int value];

       //Data is passed.
        [self.tableView reloadData];  //If its necessary 

     }    
}

希望这可以帮助。

于 2013-06-26T06:00:20.807 回答
0

发布通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"MyArraySize" object: [NSNumber numberWithInteger: [myArray count]]] userInfo:nil];

获取通知:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getSizeOfArray:) name:@"MyArraySize" object:nil];

在您收到通知的 viewController 中添加此方法:

- (void) getSizeOfArray: (NSNotification*) notification
{
    NSNumber* myArraySize = (NSNumber*) notification.object;
}

您甚至可以通过“ userInfo”发送更多数据,并使用 notification.userInfo 在选择器方法中获取该数据,但请记住它的类型是“ NSDictionary

希望这会帮助你。

于 2013-06-24T04:04:05.820 回答