在 NSOutputStream 中写入数据时更新进度视图



如何在写入数据时与NSOutputstream异步更新进度视图。我有总长度,我想按字节读取更新进度视图。正确的方法是什么。这是我的流代码:

-(void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode{
    switch (eventCode) {
        case NSStreamEventOpenCompleted: {
            //   self.nsStream = aStream;

        } break;
        case NSStreamEventHasBytesAvailable: {
            NSLog(@"NSStreamEventHasBytesAvailable");
        }break;
        case NSStreamEventHasSpaceAvailable: {
            if (self.data == nil) {
                self.data = [[NSMutableData alloc]init];
            }
            uint8_t *readBytes = (uint8_t *)[self.completeData mutableBytes];
            readBytes += self.byteIndex; // instance variable to move pointer
            int data_len = [self.completeData length];
            unsigned int len = ((data_len - self.byteIndex >= 1024) ?
                                1024 : (data_len-self.byteIndex));
            uint8_t buf[len];
            (void)memcpy(buf, readBytes, len);
            len = [self.outputStream write:(const uint8_t *)buf maxLength:len];
            self.byteIndex += len;
            NSLog(@"SHARE SUCCESSFULLY WITH %d ",self.byteIndex);
            break;
        } break;
        case NSStreamEventErrorOccurred: {
            NSLog(@"NSStreamEventErrorOccurred");
        } break;
        case NSStreamEventEndEncountered:
        {
            [self.outputStream close];
            [self.outputStream removeFromRunLoop:[NSRunLoop currentRunLoop]
                                         forMode:NSDefaultRunLoopMode];
            self.outputStream = nil; // oStream is instance variable
            break;        }   break;
        default: {
            assert(NO);
        } break;
    }
}

和自定义单元格上的进度视图

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIndentifier = @"ShareCell";
    ShareCell *shareCell = [self.shareTable dequeueReusableCellWithIdentifier:CellIndentifier];
    shareCell.delegate = self;
    // Progressview in here
    shareCell.progressView
    shareCell.lblTitle.text =[NSString stringWithFormat:@"%d",indexPath.row];
    return shareCell;
}

您可以尝试键值观察。

首先,使您的字节读取成为蒸汽阅读器的属性。

@property (nonatomic, assign) int bytesRead;

然后向读者添加侦听器。

[streamreader addObserver:listener forKeyPath:@"bytesRead" options:NSKeyValueObservingOptionNew context:NULL];

KeyPath 是属性"bytesRead"的实际名称。

然后在侦听器类中实现此函数:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

每当 bytesRead 的值发生变化时,都会调用此方法。在此方法中更新进度视图。您可能希望调整更新 bytesRead 值的频率,以避免过于频繁地更新进度视图。

最新更新