gpt4 book ai didi

ios - NSObject(RACKVOWrapper)rac_observeKeyPath :options:observer:block: EXC_BAD_ACCESS Crash

转载 作者:行者123 更新时间:2023-11-29 10:46:50 24 4
gpt4 key购买 nike

我正在使用 ReactiveCocoa 使 UICollectionView 与消息列表保持同步。在我的模型收到新消息后尝试更新我的 Collection View 时我遇到了崩溃。

这是我的 View 模型,它通过来自套接字客户端的委托(delegate)调用获取更新。

@interface ConversationViewModel : NSObject

@property (nonatomic, strong) NSMutableArray *messages;

- (RACSignal *)rac_signalForMessageReceived;

@end

@implementation ConversationViewModel
....
- (void)client:(PSClient *)theClient didReceiveMessage:(PSMessage *)aMessage {
[self.messages addObject:aMessage];
[_messageReceivedSubscriber sendNext:nil];
}
....
- (RACSignal *)rac_signalForMessageReceived {
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
self.messageReceivedSubscriber = subscriber;
return [RACDisposable disposableWithBlock:^{
self.messageReceivedSubscriber = nil;
// Do Nothing
}];
}];

[signal setName:@"rac_signalForMessageReceived"];

return signal;
}

消息对象是

@interface Message : NSObject

@property (nonatomic, assign) NSString *message;
@property (nonatomic, assign) NSString *name;

@end

下面是 Controller 如何使用它。

- (void)viewDidLoad
[super viewDidLoad];

[self.conversationViewModel.rac_signalForMessageReceived subscribeNext:^(PSMessage *message) {
[self.collectionView reloadData];
}];

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return [self.conversationViewModel.messages count];
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

PSConversationMessageCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"conversationCell" forIndexPath:indexPath];

[cell setMessage:self.conversationViewModel.messages[indexPath.row]];

return cell;
}

最后,这是我在单元格内进行绑定(bind)的方式。

- (void)awakeFromNib {
RAC(self.messageLabel, text) = RACObserve(self, message.message);
RAC(self.nameLabel, text) = RACObserve(self, message.name);
}

一旦 Collection View 重新加载,我就会在 rac_observeKeyPath:options:observer:block: 中得到一个异常。堆栈如下面的屏幕截图所示。 enter image description here

有谁知道为什么这会导致异常?或者更好的方法来处理在 ConversationViewModel 中接收消息?

最佳答案

我找到了异常崩溃的原因。我的消息对象使用 NSString 属性的分配属性类型。它需要被复制。花了很多时间来追踪那个。

关于ios - NSObject(RACKVOWrapper)rac_observeKeyPath :options:observer:block: EXC_BAD_ACCESS Crash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22122704/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com