这个问题的解决方案不再适用于Swift 3.
不再有一个属性bytes
的Data
(前身NSData
.
let data = dataToWrite.first!
self.outputStream.write(&data, maxLength: data.count)
Run Code Online (Sandbox Code Playgroud)
使用此代码,我收到错误:
Cannot convert value of type 'Data' to expected argument type 'UInt8'
Run Code Online (Sandbox Code Playgroud)
你怎么能写Data
一NSOutputStream
斯威夫特3?
我正在尝试将用户带到服务器的图像发送给服务器.我得到JPEG表示,将其附加到上传照片所需的字符串,然后通过NSOutputStream发送数据.但是,当我尝试从服务器上取回照片时,我只从顶部看到10%的照片.任何帮助,将不胜感激.
顺便说一句.插座已打开并已连接.
这是我的代码:
NSString *requestString = [NSString stringWithFormat:@"SubmitPhoto::%@::", userID];
NSData * stringData = [requestString dataUsingEncoding:NSUTF8StringEncoding];
NSData *imgData = UIImageJPEGRepresentation(image, 1.0);
NSMutableData *completeData = [[NSMutableData alloc] initWithBytes:[stringData bytes] length:[stringData length]];
[completeData appendData:imgData];
//sending NSData over to server
[self.outputStream write:[completeData bytes] maxLength:[completeData length]];
Run Code Online (Sandbox Code Playgroud) 我想使用NSOutputStream来累积数据,然后在完成后,使用内容创建一个NSData对象.我可以在输出流基于文件时执行此操作,如下所示:
NSString *tmpDirectory = NSTemporaryDirectory();
NSString *filePath = [tmpDirectory stringByAppendingPathComponent:@"tempfile"];
[[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];
NSOutputStream *outputStream = [[NSOutputStream alloc] initToFileAtPath:filePath append:NO]; [outputStream open];
// fill the output stream here
NSData *contents = [NSData dataWithContentsOfFile:filePath];
[outputStream close];
Run Code Online (Sandbox Code Playgroud)
我希望填充'contents'变量而不创建临时文件.我可以在记忆中做到这一点吗?我没有在NSOutputStream文档中看到API .
我正在编写一个使用 NSOutputStream 的应用程序。我像这样初始化连接:
delegate = self;
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)url,port, &readStream, &writeStream);
CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
inputStream = (__bridge_transfer NSInputStream *)readStream;
outputStream = (__bridge_transfer NSOutputStream *)writeStream;
[inputStream setDelegate:delegate];
[outputStream setDelegate:delegate];
loop = [NSRunLoop currentRunLoop];
[inputStream scheduleInRunLoop:loop forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:loop forMode:NSDefaultRunLoopMode];
[inputStream setProperty:NSStreamSocketSecurityLevelTLSv1 forKey:NSStreamSocketSecurityLevelKey];
[outputStream setProperty:NSStreamSocketSecurityLevelTLSv1 forKey:NSStreamSocketSecurityLevelKey];
[inputStream setProperty:NSStreamSocketSecurityLevelNegotiatedSSL
forKey:NSStreamSocketSecurityLevelKey];
[outputStream setProperty:NSStreamSocketSecurityLevelNegotiatedSSL
forKey:NSStreamSocketSecurityLevelKey];
NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates,
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot,
[NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain,
kCFNull,kCFStreamSSLPeerName,
nil];
CFReadStreamSetProperty((CFReadStreamRef)inputStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings);
CFWriteStreamSetProperty((CFWriteStreamRef)outputStream, kCFStreamPropertySSLSettings, (CFTypeRef)settings); …
Run Code Online (Sandbox Code Playgroud) 在检测我的应用程序时,我发现在将数据写入输出流时CPU使用率跃升至90%.具体来说,当网络速度非常高时.当我用Timer仪器配置它时,发现大多数cpu用于NSStream委托调用.请帮助优化编写技术以降低CPU使用率.
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
switch (eventCode) {
case NSStreamEventOpenCompleted: {
_isConnected = YES;
if([self.delegate respondsToSelector:@selector(isFTPConnectionFoundForUpload:)])
[self.delegate performSelector:@selector(isFTPConnectionFoundForUpload:) withObject:_isConnected?@"YES":@"NO"];
} break;
case NSStreamEventHasSpaceAvailable: {
bytesWritten = [self.producerStream write:&self.buffer[0] maxLength:512];
if (bytesWritten == -1) {
[self stopSendWithStatus:@"Network write error"];
}
} break;
case NSStreamEventErrorOccurred: {
NSLog(@"producer stream error %@", [aStream streamError]);
[self stopSendWithStatus:@"Stream open error"];
} break;
case NSStreamEventEndEncountered: {
} break;
default: {
} break;
}
Run Code Online (Sandbox Code Playgroud)
}
我一直试图为我的iOS应用程序启动并运行一个基本的TCP客户端,但是遇到了一个我似乎无法解决的问题.
到目前为止,我可以连接,发送一条消息,在服务器端收到,但随后我的应用程序崩溃.
Client.h
#import <Foundation/Foundation.h>
@interface Client : NSObject <NSStreamDelegate>
{
NSInputStream *inputStream;
NSOutputStream *outputStream;
}
-(void)initNetworkCommunication;
-(void)send:(NSString*)message;
@end
Run Code Online (Sandbox Code Playgroud)
Client.m
#import "Client.h"
@implementation Client
- (void)initNetworkCommunication {
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"10.0.1.51", 7769, &readStream, &writeStream);
inputStream = ( NSInputStream *)CFBridgingRelease(readStream);
outputStream = ( NSOutputStream *)CFBridgingRelease(writeStream);
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];
}
- (void)send:(NSString*)message
{
NSData *data = [[NSData alloc] initWithData:[message dataUsingEncoding:NSUTF8StringEncoding]];
[outputStream write:[data bytes] maxLength:[data length]];
}
- …
Run Code Online (Sandbox Code Playgroud) 我在将位置坐标传送到我在网络上连接的一组电机时遇到问题.我可以发送一个字符串就好了,并从电机接收文本,但我似乎无法发送一个int值.
使用NSlog我已经确定我发送的实际值是正确的,但我怀疑我通过输出流发送它的方法是错误的.有任何想法吗?
我发送64位int值的代码:
uint64_t rawInt = m1;
rawInt <<= 16;
rawInt |= m2;
NSData *buffer = [NSData dataWithBytes: &rawInt length:8];
[outputStream write: [buffer bytes] maxLength:[buffer length]];
Run Code Online (Sandbox Code Playgroud) 我需要一个可以从内存流中读写并支持查找的 Cocoa 类。在C#,MemoryStream
支持方法seek
,和在Java中,ByteArrayInputStream
支持的方法mark
,skip
和reset
。
在iOS开发中,什么是等价的类和方法?
我的项目需要上述功能,如果默认情况下 iOS 框架不支持它,那么实现我自己的最佳方法是什么?例如,编写我自己的从NSInputStream
/继承的流子类NSOutputStream
,它将在内部包含自定义代码?
我正在swift中为iOS设备上的应用程序创建一个TCP客户端.我正在使用NSOuputStream在服务器上发送数据.我们的协议是JSON类型,我们必须先发送json(unsigned Int 32位)的长度,然后发送JSON内容(作为UTF8字符串).
每件事都很好,除了我找不到如何使用write(_:maxLength:)
NSOutputStream函数编写我的Int .
要将我的JSON字符串转换为UnsafePointer<UInt8>
I,请使用以下内容
//var json: String
let encodedData = [UInt8](json.utf8)
let result = outputStream?.write(encodedData, maxLength: encodedData.count)
Run Code Online (Sandbox Code Playgroud)
有人知道如何为Int做这件事吗?
谢谢你的帮助 !
我是Cocoa的新手,但设法连接(到FTP)启动并运行,我已经为NSInputStream iStream设置了一个事件处理程序来警告每个响应(这也有效).
我设法得到的只是问候消息和连接超时60秒,关闭控制连接.
编辑:我想我的问题是"没有关闭 - >打开什么是刷新outputStream的非终止方式?
在搜索stackoverflow并发现很多NSOutputStream写入问题(例如,如何使用NSOutputStream的写入消息?)以及我的谷歌点击中的很多混乱之后,我想我会尝试提出自己的问题:
我试过在OutputStream上阅读developer.apple.com doc,但我似乎几乎不可能通过NSOutputStream oStream将一些数据(在本例中只是一个字符串)发送到"连接".
- (IBAction) send_something: sender
{
const char *send_command_char = [@"USER foo" UTF8String];
send_command_buffer = [NSMutableData dataWithBytes:send_command_char length:strlen(send_command_char) + 1];
uint8_t *readBytes = (uint8_t *)[send_command_buffer mutableBytes];
NSInteger byteIndex = 0;
readBytes += byteIndex;
int data_len = [send_command_buffer length];
unsigned int len = ((data_len - byteIndex >= 1024) ?
1024 : (data_len-byteIndex));
uint8_t buf[len];
(void)memcpy(buf, readBytes, len);
len = [oStream write:(const uint8_t *)buf maxLength:len];
byteIndex += len;
}
Run Code Online (Sandbox Code Playgroud)
以上似乎不会导致任何可用的事件.在NSStreamEventHasSpaceAvailable下键入它有时会给我一个响应,如果我通过继续创建新的连接实例来垃圾邮件,并在oStream有空闲空间时继续发送一些命令.换句话说,没有什么"正确",所以我仍然不清楚如何正确地向连接发送命令.我应该打开 - …
在写NSStream
我应该依靠的时候
' hasSpaceAvailable
'方法或'handle:event'方法中的事件
' NSStreamEventHasSpaceAvailable
'
或者我应该检查' hasSpaceAvailable
'如果不可用,我必须在特定的时间后重试或者我应该等到代表活动打电话直到我开始写?
截至目前它的工作时,我使用hasSpaceAvailable并在一段时间后重试不知道它是否正确的做法.
任何帮助都会很棒.
我需要从Internet下载大文件,并将其保存到本地磁盘.
首先,我保存这样的数据:
- (void)saveToLocalFile:(NSData *)data withOffset:(unsigned long long)offset{
NSString* localFile = [self tempLocalFile];
dispatch_async(mFileOperationQueue_, ^{
NSFileHandle* fileHandle = [NSFileHandle fileHandleForWritingAtPath:localFile];
if (fileHandle == nil) {
[data writeToFile:localFile atomically:YES];
return;
}
else {
[fileHandle seekToFileOffset:offset];
[fileHandle writeData:data];
[fileHandle closeFile];
}
});
}
Run Code Online (Sandbox Code Playgroud)
由于AFNetworking
使用NSOutputstream
将数据保存到本地是这样的:
NSUInteger length = [data length];
while (YES) {
NSInteger totalNumberOfBytesWritten = 0;
if ([self.outputStream hasSpaceAvailable]) {
const uint8_t *dataBuffer = (uint8_t *)[data bytes];
NSInteger numberOfBytesWritten = 0;
while (totalNumberOfBytesWritten < (NSInteger)length) {
numberOfBytesWritten = …
Run Code Online (Sandbox Code Playgroud) nsoutputstream ×12
nsstream ×6
ios ×5
cocoa ×2
nsdata ×2
objective-c ×2
swift ×2
afnetworking ×1
cocoa-touch ×1
connection ×1
cpu-usage ×1
file-io ×1
foundation ×1
int ×1
iphone ×1
networking ×1
nsfilehandle ×1
profiling ×1
swift3 ×1
tcp ×1
tcpclient ×1
xcode ×1