2016-04-18 20 views
7

Tôi có một ứng dụng ban đầu được tạo trong mục tiêu C (cho phép gọi phiên bản này 1) và bây giờ tôi đã chuyển đổi ứng dụng của mình sang Swift 2.0 (phiên bản 2). Một trong những chức năng chính của ứng dụng là khả năng gửi hình ảnh và văn bản từ thiết bị này sang thiết bị khác. Hình ảnh và văn bản được lưu trữ trong một NSMutableDictionary và sau đó được mã hóa thành NSData và gửi/lưu trữ trên máy chủ phụ trợ Parse. Thiết kế ứng dụng của tôi cũng có khả năng gửi hình ảnh từ một thiết bị đến một thiết bị khác.UIImage được mã hóa thành NSData trong ObjectiveC và sau đó được giải mã trong Swift

Tính năng này hoạt động tốt cho cả hai phiên bản ứng dụng của tôi - Mục tiêu C và Swift. Tuyệt quá !

Vấn đề của tôi là khi người dùng gửi NSData từ phiên bản 1 của ứng dụng của tôi sang thiết bị có phiên bản 2 (về cơ bản là hình ảnh được mã hóa trong mục tiêu C và sau đó được giải mã bằng Swift) !! Mã hóa văn bản giải mã tốt nhưng không phải hình ảnh (được lưu dưới dạng objectForKey ("dữ liệu")). Xem ví dụ bên dưới. quizData là một mảng từ điển lưu giữ (các mục keyValue) đã được gửi từ một thiết bị khác. Mảng này làm việc với tất cả các mục ngoại trừ đối tượng objectForKey ("dữ liệu"). Đối tượng này là hình ảnh được mã hóa.

var imageData = NSData() 

imageData = quizData.objectAtIndex(currentQuestionNumber).objectForKey("data") as! NSData 

    // the following always prints out lots of info to confirm the imageData has the encoded image 
    print("imageData.length = \(imageData.length)") 
    print("imageData.description = \(imageData.description)") 

    // decoding 
    photoImageView.image = UIImage(data:imageData) 

ok, vì vậy công việc trên khi hình ảnh được tạo trên một thiết bị khác bằng Swift. Nhưng nếu hình ảnh được tạo và gửi từ phiên bản 1 (mục tiêu c) thì photoImageView là trống (không có lỗi) nhưng imageData là rất lớn (bản in cho biết imageDate giữ hình ảnh người dùng).

Surley nếu đối tượng NSdata có dữ liệu cho UIImage, nó có thể được giải mã bằng ObjC hoặc Swift ?? Không có vấn đề gửi mã hơn nếu cần thiết

Câu hỏi sửa đổi như sau: Không chắc chắn nếu điều này thực sự giúp nhưng heres đang ObjC cho việc gửi một NSData qua email (tất cả dữ liệu ứng dụng được lưu một plist)

// emailArray to be populated with selected data from plist 
NSMutableArray *emailArray = [NSMutableArray arrayWithContentsOfFile:path]; 

MFMailComposeViewController *emailPicker = [[MFMailComposeViewController alloc]init]; 
emailPicker.mailComposeDelegate =self; 


/// NSdata from emailArray 
NSData *emailQuizData = [NSKeyedArchiver archivedDataWithRootObject:emailArray]; 
[emailPicker addAttachmentData:emailQuizData mimeType:@"application/quizApp" fileName:_quizNameLabel.text]; 
+0

sẽ giúp đỡ nếu bạn cho chúng ta thấy mã mã hóa các dữ liệu hình ảnh như NSData và đặt nó vào từ điển (mã Obj-C) – dirkgroten

+0

Tôi cũng sẽ thử với giải mã mã hóa hình ảnh Base64. – Maulik

+1

Không mã nào của bạn có ý nghĩa nhiều. Mã Objective-C phải làm gì với mã Swift? Mục tiêu-C đang tải một số tệp plist (có nội dung không xác định), lưu trữ mảng kết quả và gửi lưu trữ dưới dạng tệp đính kèm email. Mã Swift chỉ hiển thị một nỗ lực để lấy 'NSData' từ một số mảng không xác định. 'QuizData' đã đến từ đâu trong mã Swift? Câu hỏi của bạn cho biết có sự cố khi gửi dữ liệu từ thiết bị này đến thiết bị khác. Làm thế nào là xong. Hiển thị mã có liên quan với nhiều ngữ cảnh hơn. – rmaddy

Trả lời

8

nếu bạn sử dụng mã hóa base64 vấn đề này không nên phát sinh.

đây là việc thực hiện tại nhanh chóng:

import UIKit 

func base64StringForImage(image: UIImage) -> String? { 
    guard let data = UIImagePNGRepresentation(image) else { return nil } 
    return data.base64EncodedStringWithOptions([]) 
} 

func imageFromBase64String(string: String) -> UIImage? { 
    guard let data = NSData(base64EncodedString: string, options: []) else { return nil } 
    return UIImage(data: data) 
} 

đây là việc thực hiện trong objc:

#import <UIKit/UIKit.h> 

NS_INLINE NSString * base64StringForImage_objc(UIImage *image) { 
    NSData *imageData = UIImagePNGRepresentation(image); 
    return [imageData base64EncodedStringWithOptions:0]; 
} 

NS_INLINE UIImage * imageFromBase64String_objc(NSString *string) { 
    NSData *imageData = [[NSData alloc] initWithBase64EncodedString: string options: 0]; 
    return [[UIImage alloc] initWithData:imageData]; 
} 
Các vấn đề liên quan