Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为网络请求动态传递值_Ios_Swift_Swiftui_Swift5_Combine - Fatal编程技术网

Ios 为网络请求动态传递值

Ios 为网络请求动态传递值,ios,swift,swiftui,swift5,combine,Ios,Swift,Swiftui,Swift5,Combine,我必须传递movie.id的值,该值从名为ReviewView的视图接收 我需要将此视图中接收到的movie.id值传递给ReviewFetcher,然后使用该movie.id发出网络请求。到目前为止,我已经在ReviewFetcher中硬编码了电影id,但我要求从ReviewView接收该id,然后发出请求,然后在ReviewView中更新列表 代码如下:- 查看蚀刻机。swift import Foundation import Alamofire import SwiftUI class

我必须传递movie.id的值,该值从名为ReviewView的
视图
接收

我需要将此视图中接收到的movie.id值传递给ReviewFetcher,然后使用该movie.id发出网络请求。到目前为止,我已经在ReviewFetcher中硬编码了电影id,但我要求从ReviewView接收该id,然后发出请求,然后在ReviewView中更新列表

代码如下:-

查看蚀刻机。swift

import Foundation
import Alamofire
import SwiftUI

class ReviewObserver: ObservableObject {
    @Published var review = ReviewArray(id: 1, page: 9, results: [])
    // @State var movieID:Int

    init() {
       // self.movieID = movieID
        getReviews(movieID : 181812)
    }

    func getReviews(movieID:Int) {
        //self.review.results.removeAll()
        let reviewURL = "https://api.themoviedb.org/3/movie/"+String(movieID)+"/reviews?api_key=a18f578d774935ef9f0453d7d5fa11ae&language=en-US&page=1"

        Alamofire.request(reviewURL)
            .responseJSON { response in
                if let json = response.result.value {
                    if  (json as? [String : AnyObject]) != nil {
                        if let dictionaryArray = json as? Dictionary<String, AnyObject?> {
                            let json = dictionaryArray
                            if let id = json["id"] as? Int,
                               let page = json["page"] as? Int,
                               let results = json["results"] as? Array<Dictionary<String, AnyObject?>> {
                               for i in 0..<results.count {
                                   if let author = results[i]["author"] as? String,
                                      let content = results[i]["content"] as? String,
                                      let url = results[i]["url"] as? String {

                                       let newReview = ReviewModel(author: author,
                                                                    content: content,
                                                                   url: url)

                                       self.review.results.append(newReview)

                                    }
                                }
                            }
                        }
                    }
                }
            }
       }
  }
import SwiftUI

struct ReviewsView: View {
    @State var movie: MovieModel
    @Binding var reviews:[ReviewModel]
    @ObservedObject var fetcher = ReviewObserver()

    var body: some View {
        VStack(alignment:.leading) {
            Text("Review")
                .font(.largeTitle)
                .bold()
                .foregroundColor(Color.steam_rust)
                .padding(.leading)
            Divider()
            // Text(String(fetcher.movieID))
            List(fetcher.review.results) { item in
                VStack(alignment:.leading) {
                    Text("Written by : "+item.author)
                        .font(.body)
                        .bold()
                        .padding(.bottom)
                    Text(item.content)
                        .font(.body)
                        .lineLimit(.max)
                }
            }
        }
    }
}
import Foundation
import SwiftUI
import Combine

struct MovieArray: Codable {
    var page: Int = 0
    var total_results: Int = 0
    var total_pages: Int = 0
    var results: [MovieModel] = []

}

struct MovieModel: Codable, Identifiable {

    var id : Int
    var original_title: String
    var title: String
    var original_language:String
    var overview: String
    var poster_path: String?
    var backdrop_path: String?
    var popularity: Double
    var vote_average: Double
    var vote_count: Int
    var video: Bool
    var adult: Bool
    var release_date: String? 
}
MovieModel.swift

import Foundation
import Alamofire
import SwiftUI

class ReviewObserver: ObservableObject {
    @Published var review = ReviewArray(id: 1, page: 9, results: [])
    // @State var movieID:Int

    init() {
       // self.movieID = movieID
        getReviews(movieID : 181812)
    }

    func getReviews(movieID:Int) {
        //self.review.results.removeAll()
        let reviewURL = "https://api.themoviedb.org/3/movie/"+String(movieID)+"/reviews?api_key=a18f578d774935ef9f0453d7d5fa11ae&language=en-US&page=1"

        Alamofire.request(reviewURL)
            .responseJSON { response in
                if let json = response.result.value {
                    if  (json as? [String : AnyObject]) != nil {
                        if let dictionaryArray = json as? Dictionary<String, AnyObject?> {
                            let json = dictionaryArray
                            if let id = json["id"] as? Int,
                               let page = json["page"] as? Int,
                               let results = json["results"] as? Array<Dictionary<String, AnyObject?>> {
                               for i in 0..<results.count {
                                   if let author = results[i]["author"] as? String,
                                      let content = results[i]["content"] as? String,
                                      let url = results[i]["url"] as? String {

                                       let newReview = ReviewModel(author: author,
                                                                    content: content,
                                                                   url: url)

                                       self.review.results.append(newReview)

                                    }
                                }
                            }
                        }
                    }
                }
            }
       }
  }
import SwiftUI

struct ReviewsView: View {
    @State var movie: MovieModel
    @Binding var reviews:[ReviewModel]
    @ObservedObject var fetcher = ReviewObserver()

    var body: some View {
        VStack(alignment:.leading) {
            Text("Review")
                .font(.largeTitle)
                .bold()
                .foregroundColor(Color.steam_rust)
                .padding(.leading)
            Divider()
            // Text(String(fetcher.movieID))
            List(fetcher.review.results) { item in
                VStack(alignment:.leading) {
                    Text("Written by : "+item.author)
                        .font(.body)
                        .bold()
                        .padding(.bottom)
                    Text(item.content)
                        .font(.body)
                        .lineLimit(.max)
                }
            }
        }
    }
}
import Foundation
import SwiftUI
import Combine

struct MovieArray: Codable {
    var page: Int = 0
    var total_results: Int = 0
    var total_pages: Int = 0
    var results: [MovieModel] = []

}

struct MovieModel: Codable, Identifiable {

    var id : Int
    var original_title: String
    var title: String
    var original_language:String
    var overview: String
    var poster_path: String?
    var backdrop_path: String?
    var popularity: Double
    var vote_average: Double
    var vote_count: Int
    var video: Bool
    var adult: Bool
    var release_date: String? 
}
删除ReviewObserver类的
init()
。然后调用
.onAppear
VStack
修饰符的getReviews方法。你需要什么的想法:

class ReviewObserver: ObservableObject {
    @Published var review = ReviewArray(id: 1, page: 9, results: [])
    func getReviews(movieID:Int) {
//you block,, anything you wanna do with movieID.
//Assume you are going to change 'review' variable

 }
}